[筆試] 編程題不要再踩這些坑!!!


循環輸入輸出處理常見問題

1、為什么需要循環輸入輸出:通常來說OJ對於每道題里面有.in和.out文件,分別表示測試數據的輸入和輸出。如果某些編程題的所有數據都只做在一個.in和一個.out中,這樣就會變成多組測試了,所以需要提交的代碼中循環處理。

2、處理方法:其實這個問題可以避免,就是編程題后台每個樣例做一組對應的.in和.out文件,這樣就變成單組測試,代碼就不需要循環處理,但是平時練習的題目質量不一,這個問題都會出現。

代碼里面循環處理了即使是單組測試也會完全沒問題,所以為了偷懶,可以全寫成循環處理。

3、還有一個坑:但是這里會發生一個問題(十分常見!!!!),如果測試數據是多組的,但是恰巧你代碼里面需要些標記數組,map,set等,在循環內一定記得清空,不然可能會產生前面的測試樣例影響了后續數據的答案。

對於各種語言的一些基本知識

做編程題強烈建議使用C/C++,做編程題強烈建議使用C/C++,做編程題強烈建議使用C/C++,做編程題強烈建議使用C/C++

重要的事情比三遍再多說一遍,下面說說具體理由:

1、出題人通常會使用C/C++編寫標程,數據也是由標程制造的,所以使用跟出題人一樣的語言會比較穩妥

2、C/C++效率比較高,通常來說一般OJ對於一道題目的時限限制會區分C/C++和其他語言,通常處理方式是假設C/C++時限是1s,其他語言就會給2倍時限,甚至更多。
--------------------------------------------我是分割線----------------------------------------------

3、關於cin cout和scanf printf。做題的時候盡量使用scanf printf。下面告訴一個小常識,不要驚訝:cin cout比scanf printf慢20倍左右!!!!!!!

一旦遇到大數據量,光是讀入就有可能跪掉。

你或許可以使用std::ios::sync_with_stdio(false); 這條語句關掉scanf和cin的同步,加快效率。但是即使這樣cin還要慢5倍左右,而且一旦使用了這條語句,scanf和cin混用可能就會造成一些奇怪的錯誤

4、Java相關:Java整體效率大概比C/C++慢2~3倍,但是Java寫編程題也沒什么問題,主要就是處理好各種輸入輸出的情況。

5、python等等其他語言,做編程題真心不建議使用這些語言,要么效率低下,要么會有些更深的坑。

關於輸出格式

格式問題經常令人抓狂,其實主要都有幾個常見的坑
1、行末空格:比如我輸出需要打印多個數需要使用空格分隔的時候,我們循環使用printf("%d ",x);這種會很方便,但是這樣會導致行末多一個空格,后台系統會嚴格比對你的輸出和.out文件,這樣也會被判錯誤

2、換行問題,對於每個樣例,建議輸出完全之后都換行一下。對於一些題目,可能就是不換行就導致了后面輸入數據錯位,那就肯定不可能過了。

關於時間復雜度分析:

通常來說一般的系統1s能跑的算法量級是不足1e8的,所以做題的時候評估算法效率很重要,直接判斷你的做法能否通過,當然這是以C/C++為標准的,其他語言自己乘個時間倍數。。

舉個例子,比如題目n = 1e5,那么我就可以很敏感的知道我的算法需要一個 O(n) 或者 O(nlogn)。平方復雜度直接拜拜!

最后關於 "我本地能通過,交上去就是不對"

這個問題很蠢!通不過就是有一些問題。一個是要累積經驗,分析到底可能出現的問題在哪里。另外不要使用一些奇怪的函數和行為。之前有見過有人使用了windows和linux平台那個功能的函數名都不一樣的奇葩函數。 如果你使用C/C++,最好別使用VS來寫算法code,這個默認是MS的,一般OJ上面編譯器都不會是這個鬼。


免責聲明!

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



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