OJ编程题教训
引用來自牛客網的一個討論帖,帖子中列舉了最常見的問題。
循環輸入輸出處理常見問題?
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上面編譯器都不會是這個鬼。
除此之外,總結下自己出現的問題。?
1. 昨天在賽碼網上做的京東的筆試題就遇到上面所說的本地調試通過,提交不通過的問題。?
這種問題出現了,就要去檢查一下幾點:?
A?輸入輸出是不是按照題意進行的。?
B?是不是有些步驟沒有完成。?
C?對于邊界輸入的檢查?
D?算法的復雜度是不是過高
牢記:代碼不通過肯定是自己哪里出了什么問題,檢查代碼!再三看題讀懂題意!!!
對于要求有多組輸入的題目采用如下方式:
#include <stdio.h> int main() {int input;while(scanf("%d",&input) != EOF){//在此處理數據printf("%d\n",input);}return 0; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
如果使用了STL容器,要記住在處理每組數據的時候要對容器進行清空操作!!!
#include <stdio.h> #include <vector> using namespace std;int main() {int input;vector<int> vt;while(scanf("%d",&input) != EOF){//在此處理數據printf("%d\n",input);vt.clear();}return 0; } from: http://blog.csdn.net/Robin__Chou/article/details/52450121總結
- 上一篇: Spring实现AOP的4种方式
- 下一篇: 学习笔记——Java