OJ常用技巧

2021-10-02 13:33:27 字數 1326 閱讀 6391

0.前言

1.dfs常用技巧

1.1 適當剪枝

這個不說

1.2 新增返回條件

比如說乙個程式只有達到某種條件時才會返回,但是因為條件太少,返回不多,就容易出現dfs爆棧的情況,所以需要增加條件。通常情況下,可以用增加閾值的情況來限制深搜的步驟。比如說:馬的遍歷 這道題,(很明顯,這是一道bfs的題,但是如果真的要用dfs寫的話,就很容易出現超時。)

比如我用如下的**交這道題的時候,就有乙個測試點超時。【如下圖所示】

這時候如果真想用dfs交題就可以嘗試新增乙個dfs的返回條件。**如下:

//count 代表馬兒走了多少步

//(x,y) 代表當前的座標值

void

dfs(

int x,

int y ,

int count)

其中的關鍵語句就是

if

(cur >

200)

return

;

新增完之後就可以ac了。

其實上面說的這種情況其實本質上就是迭代加深搜尋的應用,因為搜尋的越深,時間就越費時間,但最優解可能在搜尋樹的另一半的很淺的分支上。這時就會導致搜尋效率很低!這時如果能夠很好的限制搜尋高度,就會很快的得到問題解。【重複高度的搜尋相比於指數增長的深度搜,還是很小的數字!】

2.輸入技巧

2.1 for迴圈

for迴圈真的能控制輸入次數嗎?別被假象迷惑!

給出下面一段程式,已經輸入資料,判斷是否ok。

void

test5()

cout <<

"*****====\n"

;for

(int i =

1;i<=n+n;i++

)}

輸入及執行結果如下:

可以看到這裡只輸入了3項,但是n=3,其實for迴圈中要輸入6項才對!但是為啥這麼做也行呢?因為程式碰到了輸入結束符(eof),也就是圖中表示的^z,所以程式就會認為輸入已經終止了。

這樣的操作有什麼用嗎?當然有!當我們在處理乙個環時,因為頭尾是相連的,我們就可以通過這種擴大兩倍的方式來簡化頭尾的處理。

oj判題技巧

2.oj有嚴格的輸入輸出格式。3.oj只會嚴格的比較輸入和輸出格式,簡單的比較檔案。4.輸入格式 1.預先不輸入資料的組數,讀到檔案末尾 求a b c while scanf d d a,b eof c while cin a b 2.預先知道組數和只有一組的輸入和平常的程式設計一樣。5.注意細節,...

oj的一些技巧。

有關卡常的oj經驗 1,常用的c 輸入輸出中,cin cout 包括getline cin,str scanf printf getchar putchar 使用這種方法,在資料量較大時 百萬次運算以上 能有較大的優化,cin cout比scanf和printf慢了幾百ms甚至上千ms,原因在於ci...

OJ測試技巧 大量示例測試方法

首先編寫test.c,改 將產生輸入用例到指定檔案test.txt,因此此檔案生成的文字格式需要根據需求而定 比如必要的換行符之類 然後編寫std solution.c,可以根據輸入產生相應正確的輸出,用於後面進行答案比對,因為需要輸入大量示例,所以要對輸入進行迴圈處理並設定退出條件 假設我們需要驗...