本說明文件僅供參考,
比賽時以

比賽主機

上之資訊為準。

The 2020 NTU NPSC

「比賽時間內」泛指:

模擬測試,初賽,決賽活動期間內。

比賽快結束了!
Kattis文件
還沒開始。
比賽 將會開始於 -4 days 23:45:31

經過時間

5:00:00

剩餘時間

0:00:00

常見問題


General

我找到了個bug? / 我有個在文件中沒有答案的問題。 / 我覺得這部分應該要怎麼樣實作比較好。

聯絡 我們,告訴我們這件事。

你們有存下我們的 submission 嗎?

有的,我們有存下你的 submission。 偶而有些題目會有問題,或是執行時間限制被修改了(這不會很常發生), 我們會需要重新 judge 該題目的所有 submission。 存下的 submission 也會用來偵測作弊。


Judging

Judge 是怎樣進行的呢?

首先 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。

我拿到了 Time Limit Exceeded,這表示我的output結果都是正確的嗎?

不是。我們會等到你的程式正常結束才檢查 output 的結果。

我拿到了 Time Limit Exceeded,你可以告訴我我的程式比時限慢了多少嗎?

對不起,沒辦法。如果你的程式跑超過時限,judge 會自動終止該程式, 所以無法分辨你的程式是卡在無窮迴圈, 或「只是慢了一些」。

如果有多組測資檔,time limit 意思是?

如果有多組測資檔,time limit 表示「每組」測資都有這樣的時限。

我拿到 Wrong Answer,這表示我的程式至少沒有因為你們的測試資料而 crash 嗎?

不,不代表喔。如果有多組測資 Wrong Answer 有可能會在你程式跑過所有測資之前就偵測到。


C/C++

如果程式沒有 return 0 會怎樣?

如果程式回傳非零的值會拿到 Run Time Error, 但現在的 C++ 或是 C99 的編譯器,只要 (a) 讓 main function 回傳值是 int,和 (b) 不要自行寫出回傳非零的值的程式, 就不會以這樣的問題。 如果在 C 裡自行定義 main 的回傳型態, 例如我們使用 float 或是 void 當作回傳的型態, 會有未定義的行為,有可能會造成 Run Time error。 最後,絕對不會因為在 main 最後加上 return 0 而造成錯誤,所以如果順手的話就加上吧。

如果遇到使用 cin 和 cout 處理 I/O 速度太慢的話,該怎麼辦呢?

至少有三種以上的方法可以讓 cincout I/O 在 C++ 中的速度變快。 不過不管你做什麼,使用 C 有的 stdio 函式 (例如 scanfprintf) 始終是比較快的。 如果你有更多的技巧,我們很樂意 聽聽

第一點是 cincout 會要跟 C stdio 函式同步, 我們可以透過使用 ios::sync_with_stdio(false); 來關掉這個同步。

另一點是 cincout 是綁定的, 這表示從當你使用 cin 的同時,cout 會被 flush。 當題目有大量輸入輸出交替的情況,這會讓速度變慢。 為了要取消這個功能,我們可以使用 cin.tie(NULL); 指令, 請注意 sync_with_stdio() 會 reset 這個設定, 所以請確定這兩個指令的使用順序是對的。

第三點,我們要知道 cout << endl 會 flush cout。 但要注意的是這功能無法被取消, 所以如果你要輸出大量的 output,可能不要使用 endl, 改用 "\n" 會好些。