Time Limit Exceeded的原因及避免方法


經常會遇到這種令人抓狂的情況

自己編寫的程序在codeblocks上怎么編譯運行都能輸出正確結果

然而一提交,卻無法Accept,很多時候顯示的並不是Wrong Answer 而是比WrongAnswer更令人絕望的  。

在oj中,給定的Time Limit 是1000MS,出現Time Limit  Exceeded則說明這個程序的運行時間超過了這個限度。

經過幾道題,我猜想了幾個關於超時的原因:

————————————————————————————————————————————————————

1.沒有循環終止條件。

就是說程序中存在一個循環,但是這個循環沒有終止條件,或者說是條件太寬泛,在運行的時候雖然能輸出結果,但這個循環會一直循環下去,導致運行時間過長。

例如:

在1001中,要測試多組數據,進行多次循環,

如果這樣寫

for(m=0;m>0;m++)

scanf(.......)

......

企圖讓輸入一直循環,理論上並沒有什么問題,程序也能運行正確,但卻會超時。

因為沒有一個終止的條件,計算機會一直不斷去運行,m只會無限大,這是實際一種很無賴的做法。

 

而如果要想用一個合理的方式實現無限次循環,就需要用

while(scanf()!=EOF)

......

這里雖然也可無限次的循環,卻有了終止條件:返回值為-1 的時候

關於while(scanf()!=EOF)的用法原理,

我再網上查閱得到:

  scanf("%d,%d", &a, &b)中

  如果a和b都被成功讀入,那么scanf的返回值就是2

    如果只有a被成功讀入,返回值為1

    如果a和b都未被成功讀入,返回值為0

 如果遇到錯誤或遇到end of file,返回值為EOF。

——————————————————————————————————————————————————————

2.函數調用超時。

例如:

在1279中,需要用到一個n的階乘。

在第一次做的時候,我調用了一個遞歸函數來求階乘,運行測試正確,卻出現了超時情況。

然后換了一種做法,用一個for循環去求階乘,結果就通過了。

我上網查詢得到,遞歸調用因為經常會調用自身很多次,所以時間的復雜度是指數級別的。

——————————————————————————————————————————————————————

3.程序算法不夠優化。

就是說自己的程序太復雜,存在更快更有效率的方法。

所以在解決問題時,應盡量選擇簡單的算法。

如果遇到了這種情況,只能換一個思路了。

——————————————————————————————————————————————————————

4.程序本身存在問題。

轉載自:https://blog.csdn.net/MTOY_320/article/details/78363375?locationNum=7&fps=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM