競賽入門
作者: D1stance
何謂競技程式
競技程式 = 演算法競賽程式, 在競程中,選手會被給定若干道題目,你要透過程式實作的方式,在題目要求的執行時間以及記憶體空間限制下解出題目, 而所謂的演算法與資料結構就是用來解決問題的工具。
演算法 ?
一種有效且正確處理資料的方式,丟入一些輸入的數據後, 透過演算法後可以產出正確的輸出結果。
資料結構 ?
資料結構是用來組織和存儲資料的方式, 根據其設計的不同,可以用來加速資料的存取、修改和刪除等操作。
競程題目範例
給你一個機器人的編號,請你跟這個機器人說 hello。
技術規格
- \(1 \le id \le 100\)
輸入格式
輸入只有一行,包含一個正整數 id,代表機器人的編號。
輸出格式
輸出一行,內容為 "Hello, Robot id!",其中 id 為輸入的機器人編號。
範例輸入
42
範例輸出
Hello, Robot 42!
這時候,如果你使用程式語言實作,直接印出
Hello, Robot 42!
可以通過範例測資,但是你沒有考慮到所有可能的情況,
因為題目有說 id 介於 1 ~ 100 之間,所以你應該讀取 id 的值,然後印出對應的結果。
也就是說,在面對任何一道競程題目時,你都應該要先仔細閱讀題目, 了解題目的要求與限制,並且還要能處理範圍內的所有可能輸入。
評測
競程題目通常會有一個評測系統,這個系統會自動執行你的程式, 並且將你的程式輸出的結果與題目要求的輸出結果進行比對, 如果你的程式輸出結果與題目要求的輸出結果一致,則視為通過測試。 如果不一致,則視為未通過測試。
以下是幾種常見的評測結果:
- AC (Accepted):通過測試,輸出結果與題目要求一致。
- WA (Wrong Answer):未通過測試,輸出結果與題目要求不一致。
- TLE (Time Limit Exceeded):程式執行時間超過限制。
- MLE (Memory Limit Exceeded):程式使用的記憶體超過限制。
- RE (Runtime Error):程式在執行過程中發生錯誤,例如除以零、陣列越界等。
- CE (Compile Error):程式編譯錯誤,通常是語法錯誤或使用了未定義的變數等。
其中 CE 是一個應該在提交程式碼前就要避免的錯誤, 至於 MLE 比較特別,在我們 ICPC 系列賽事中,通常不會有這個錯誤, 因為我們使用的 DomJudge 系統沒有這個評測結果,會被歸類在 RE 中。
AC 跟 WA 很好理解,而 TLE 是因為你的程式在執行時超過了題目要求的時間限制, 通常是演算法效率不夠高,或是程式碼中有無限迴圈等問題。
RE 則是因為你的程式在執行時發生了錯誤,通常是因為發生了一些無法被處理的情況,例如除以零,在數學上是無意義的,所以程式中也不知道如何處理這種情況。
MLE 則是因為你的程式使用的記憶體超過了題目要求的限制, 通常是因為使用了過多的資料結構。
競程的基本流程
- 閱讀題目:仔細閱讀題目要求,了解輸入輸出格式、限制條件等。
- 思考解法:根據題目要求,思考如何使用演算法和資料結構來解決問題。
- 實作程式:使用你熟悉的程式語言實作解法,注意輸入輸出格式。
- 測試程式:使用題目提供的測資來測試你的程式,確保程式能正確處理所有情況。
- 提交程式:將你的程式提交到評測系統,等待評測結果。
因為競程通常是團隊比賽,所以也許閱讀題目、思考解法、實作程式這三個步驟可能會由不同的隊員來完成,每個環節都很重要, 如果閱讀題目不仔細,可能會導致思考解法時忽略了某些限制條件, 如果思考解法不夠深入,可能會導致極端情況下程式無法正確處理, 同時實作能力也很重要。
那我們的第一個章節就到這裡, 下一章開始會介紹 C++ 的基礎語法, 因為 C++ 是我們競程中使用的主要程式語言, 比起常見的 Python 或 Java,C++ 在競程中有更好的性能表現, 所以我們會使用 C++ 來進行競程的學習與實作。