Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

競賽入門

作者: 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 則是因為你的程式使用的記憶體超過了題目要求的限制, 通常是因為使用了過多的資料結構。

競程的基本流程

  1. 閱讀題目:仔細閱讀題目要求,了解輸入輸出格式、限制條件等。
  2. 思考解法:根據題目要求,思考如何使用演算法和資料結構來解決問題。
  3. 實作程式:使用你熟悉的程式語言實作解法,注意輸入輸出格式。
  4. 測試程式:使用題目提供的測資來測試你的程式,確保程式能正確處理所有情況。
  5. 提交程式:將你的程式提交到評測系統,等待評測結果。

因為競程通常是團隊比賽,所以也許閱讀題目、思考解法、實作程式這三個步驟可能會由不同的隊員來完成,每個環節都很重要, 如果閱讀題目不仔細,可能會導致思考解法時忽略了某些限制條件, 如果思考解法不夠深入,可能會導致極端情況下程式無法正確處理, 同時實作能力也很重要。

那我們的第一個章節就到這裡, 下一章開始會介紹 C++ 的基礎語法, 因為 C++ 是我們競程中使用的主要程式語言, 比起常見的 Python 或 Java,C++ 在競程中有更好的性能表現, 所以我們會使用 C++ 來進行競程的學習與實作。