0.3 什麼是競程
¶競程是什麼?
競程是「競技程式設計」的縮寫,又稱為演算法競賽。簡單來說,就是「寫程式比賽誰解題最快、最準確」。
¶比賽形式
通常會給你一個題目,你需要:
- 讀懂題目需求
- 想出解法(演算法)
- 用程式實現
- 在時間和記憶體限制內,用各式測試資料驗證正確性
¶為什麼要用電腦來算?
實際上,所有寫程式能解出來的問題,人類用手算也一定能解得出來,主要差別在於計算速度。
以加法為例:
- 數學問題:「請計算 3+5 的值。」
- 競程問題:TIOJ 1002. A+B Problem
這麼簡單的問題,為何需要用電腦?因為若把問題改成「一次解一億個加法」,人類一生都算不完,但電腦一秒內就能完成。
¶同樣的問題,方法有好壞之分
那麼,競程就只是把人類做的事寫成程式碼而已嗎?No! 就算解同樣的問題,也有好方法和壞方法之分。以下舉兩個例子:
¶例 1:質數判定
題目:「給你一個正整數 x,請判斷 x 是否為質數。」
樸素方法:根據質數的定義(大於 1 且只能被 1 和自己整除),把 2 到 x-1 的每一個數都拿去除除看 x;只要它們全都除不盡,x 就是質數。這樣總共要試 x-2 個數。
更好的方法:可以用數學證明,其實只要試 2 到 \sqrt{x} 的數就夠了。例如 x = 10000 時,前者要試約 1 萬次,後者只要試 100 次。
¶例 2:比較輕重
題目:「給你 4 個重量不同的物品,每次只能比較兩個物品哪個輕、哪個重。求最輕和最重的物品,至少要比較幾次?」
直覺方法:分別花 3 次比較找最輕、再花 3 次找最重,共 6 次。
但實際上有更省次數的方法!這留給大家自己思考。Codeforces 上有這題:CF 730 B. Minimum and Maximum。
¶演算法 vs 實作能力
如上面兩個例子,大部分競程題目是在考驗大家能否設計出比較好的解決問題方法。解決問題的方法就是「演算法」,這就是為什麼這些比賽也被稱為「演算法競賽」。
但設計出演算法後,我們還得把它用程式碼寫出來,才能在比賽中確實得分。把演算法用程式碼實現的能力就是「實作能力」。沒有實作能力,設計出再好的演算法也沒用。
實作能力跟「對程式語言的熟悉度」與「邏輯思維能力」有關。所以 AA 競程 Level 0 會先幫大家加強對程式語言的熟悉度與基本邏輯思維,之後學習演算法的路才會通順。
¶有哪些台灣學生能參加的競程比賽與相關檢定?
| 適合對象 | 比賽 / 檢定名稱 | 舉辦時間 |
|---|---|---|
| 升國一 ~ 升大學 | YTP 少年圖靈計劃 | 每年暑假 |
| 不限年紀 | APCS 大學程式設計先修檢測(升大學的程式檢定科目) | 每年 1、6、10 月 |
| 高三以下 | 資訊奧林匹亞 TOI(選拔代表參加 IOI) | 每年 3 ~ 4 月 |
| 高中生 | 全國資訊學科能力競賽 | 每年上學期 |
| 高中職學生 | 成大暑期高中生程式設計邀請賽(南部少見的高中組隊賽,決賽得獎可取得成大資工特殊選才報名資格) | 每年暑假(約 5 月初賽、8 月決賽) |
| 高三以下 | 美國資訊奧林匹亞 USACO | 每年 12 ~ 3 月 |
| 大專在學學生 | 大學程式能力檢定 CPE(上大學後可考的程式檢定,大專生免費報考,常作為資工系所的畢業門檻或推甄參考) | 每年四次,每季一次 |
| 國際線上 | Codeforces、AtCoder | 每週都有比賽 |
¶競程有什麼有趣的地方?
- 解題的快感:想出演算法的那一刻、實現它、看它 AC(Accepted,通過全部測試)的感覺無敵爽
- 無窮無盡的挑戰:演算法的世界博大精深,永遠有更難的題要挑戰
- 全球社群:Codeforces、AtCoder 上有來自世界各地的競程者,可以和他們比試高下
- 業界價值:多數軟體相關的行業,會用競程類型的題目來篩選面試者