比賽時以
比賽時以
請 聯絡 我們,告訴我們這件事。
有的,我們有存下你的 submission。 偶而有些題目會有問題,或是執行時間限制被修改了(這不會很常發生), 我們會需要重新 judge 該題目的所有 submission。 存下的 submission 也會用來偵測作弊。
首先 Kattis 會編譯你的程式,如果編譯器編譯失敗,她會 judge 為 Compile Error。 如果編譯成功,她會執行編譯出的執行檔並輸入第一組測試資料。 如果執行時間過長、意外中止或是用過多的記憶體, 她會 judge 成 Time Linit Exceeded、Run Time Error 和 Memory Limit Exceeded。 如果程式執行過程正常,她會檢查 output 結果是否正確。
如果有多組測資檔案, 他會繼續一樣的流程來 judge 之後的測試資料檔, 直到所有結果都 Accepted, 只要有個錯誤被找到, 她就會停止並且回報那個錯誤。 測試每個測試資料的時候,都會開一個全新的 process 來執行你的程式,也就是你可以假設每一筆測試資料間的測試是獨立的。
如果是 "IOI" 題目,你的程式一定會跑過所有的測資檔案(每個測資檔會重新跑一支程式), 結果都會是 Accepted(score) 的形式, 這裡 score 會是個 0 到 100 的數字。 想知道每個測試資料的結果,可以去看信箱收到的信,或是登入後去看該 submission。 如果你的程式對於所有測資檔都回傳錯誤的答案, 你還是會得到 Accepted(0) 而不是 Wrong Answer。
不是。我們會等到你的程式正常結束才檢查 output 的結果。
對不起,沒辦法。如果你的程式跑超過時限,judge 會自動終止該程式, 所以無法分辨你的程式是卡在無窮迴圈, 或「只是慢了一些」。
如果有多組測資檔,time limit 表示「每組」測資都有這樣的時限。
不,不代表喔。如果有多組測資 Wrong Answer 有可能會在你程式跑過所有測資之前就偵測到。
如果程式回傳非零的值會拿到 Run Time Error, 但現在的 C++ 或是 C99 的編譯器,只要 (a) 讓 main function 回傳值是 int,和 (b) 不要自行寫出回傳非零的值的程式, 就不會以這樣的問題。 如果在 C 裡自行定義 main 的回傳型態, 例如我們使用 float 或是 void 當作回傳的型態, 會有未定義的行為,有可能會造成 Run Time error。 最後,絕對不會因為在 main 最後加上 return 0 而造成錯誤,所以如果順手的話就加上吧。
至少有三種以上的方法可以讓 cin 和cout I/O 在 C++ 中的速度變快。 不過不管你做什麼,使用 C 有的 stdio 函式 (例如 scanf 和 printf) 始終是比較快的。 如果你有更多的技巧,我們很樂意 聽聽
第一點是 cin 和 cout 會要跟 C stdio 函式同步, 我們可以透過使用 ios::sync_with_stdio(false); 來關掉這個同步。
另一點是 cin 跟 cout 是綁定的, 這表示從當你使用 cin 的同時,cout 會被 flush。 當題目有大量輸入輸出交替的情況,這會讓速度變慢。 為了要取消這個功能,我們可以使用 cin.tie(NULL); 指令, 請注意 sync_with_stdio() 會 reset 這個設定, 所以請確定這兩個指令的使用順序是對的。
第三點,我們要知道 cout << endl 會 flush cout。 但要注意的是這功能無法被取消, 所以如果你要輸出大量的 output,可能不要使用 endl, 改用 "\n" 會好些。