1. 程式人生 > >OJ練習中的注意事項

OJ練習中的注意事項

       最近準備研究生複試,在OJ練習程式設計。因為準備考研一年時間幾乎沒怎麼寫程式,另一方面以前也只是稍稍接觸過一點OJ程式設計,所以總會遇到很多問題,在這裡總結整理一下。估計也沒人關注我的部落格,主要是整理給自己看吧。

1.C++中的cin、cout貌似速度比C語言的scanf、printf慢,碰到過一道題把cin、cout換掉就好了

2.使用STL:

         使用STL中sort時,注意比較函式cmp(template a, template b)貌似要排除a、b比較的分量相等的情況,否則VS2013執行到sort時會有警告(這個問題等我回學校後可以看看《C++ primer》中相關章節)

3.輸出格式: 

         不要在某些行末尾多打空格

        時有些時候需要特別關注換行的問題,這種錯誤我覺得比較神奇。。。。仔細閱讀題目吧,應該…能夠避免。(例如PAT1101)

4.(小竅門)應對時間與空間的限制上,如果擔心自己的方法超時,先寫個大概(把其中排序之類的耗時間的流程寫上),提交一下看看是否出現超時。(不過目前只在PAT上用過這個方法)

5.(接2) 回學校後到複試前,要是有時間,把《c++ primer》中<第二部分>看一下,即標準庫中的一些常用的演算法、資料結構

6.在涉及數值運算時,不要預設資料是“整數”,保險點的話,就把需要計算的資料全都設成double。另外,記住setw(n),setfill('x'),setprecision(n)

   例如:cout.setf(ios::fixed) ; cout << fixed << setprecision(2) << money << endl;  //保留兩位小數

7.int/long/long long 的表示範圍:

         對於以上整數型別,可以用sizeof(a)測試所佔空間,然後根據空間大小用16進位制方法賦最大值然後輸出,來測一下該型別做能表示的最大值。但有時雖然題目所給的資料滿足較低寬度型別的數值表示範圍(比如int),但演算法中會涉及相乘等運算,使得中間結果可能超過較低較低寬度的範圍,此時需要選擇更大範圍的數值型別(比如long long)。 在pat1085中,有一個測試點一直都過不了,我也半天沒找到bug,最後看《演算法筆記》才意識到是中間過程會超出int型別的範圍導致最終結果錯誤。

8.找規律類問題:

       開動腦筋,舉一個一般化的例子,多觀察。

9.提取數位應該熟練:

       例:

a = 1;
	while (N/a!=0)
	{
		left = N / (a * 10);
		now = N / a % 10;
		right = N%a;
		a *= 10;
	}

10.一個慘痛的教訓, 查錯不能太謹慎……:

       程式執行如果出現死迴圈,先不要急著一步步斷點排查,而是先想想“邊界”情況。比如棧中只剩一個元素時的情況是不是需要特殊處理。  今天不到15分鐘寫出了一道題99%的程式,然後執行出現死迴圈,我就一步步端點排查。結果查到迴圈最後才發現問題十分簡單,就是佇列中只剩一個元素的情況沒有考慮跳出迴圈…這麼簡單的問題,花了40分鐘來端點排查。

11.記住化繁為簡,凡是感覺很麻煩,一個不算複雜的處理過程,用了好多臨時變數,大概率是搞麻煩了。回頭再看看pat1097程式碼,還能不能想起當時出的問題。

12.自定義函式的引數問題。注意形參、實參的問題。例如void swap_tree(binode*& root),有必要加&,否則root的修改只停留在swap_tree的區域性

printf的用法是:printf("格式控制字串",輸出引數一,輸出引數二);

(int型用%d,float和double用%f)

scanf的用法是:scanf("格式控制字串",輸入引數一,輸入引數二);

(int型用%d,float用%f,double型用%lf)

目前就這些,慢慢更新~