0.3 什麼是競程

競程是什麼?

競程是「競技程式設計」的縮寫,又稱為演算法競賽。簡單來說,就是「寫程式比賽誰解題最快、最準確」。

比賽形式

通常會給你一個題目,你需要:

  1. 讀懂題目需求
  2. 想出解法(演算法)
  3. 用程式實現
  4. 在時間和記憶體限制內,用各式測試資料驗證正確性

為什麼要用電腦來算?

實際上,所有寫程式能解出來的問題,人類用手算也一定能解得出來,主要差別在於計算速度

以加法為例:

這麼簡單的問題,為何需要用電腦?因為若把問題改成「一次解一億個加法」,人類一生都算不完,但電腦一秒內就能完成。

同樣的問題,方法有好壞之分

那麼,競程就只是把人類做的事寫成程式碼而已嗎?No! 就算解同樣的問題,也有好方法和壞方法之分。以下舉兩個例子:

例 1:質數判定

題目:「給你一個正整數 x,請判斷 x 是否為質數。」

樸素方法:根據質數的定義(大於 1 且只能被 1 和自己整除),把 2x-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(上大學後可考的程式檢定,大專生免費報考,常作為資工系所的畢業門檻或推甄參考) 每年四次,每季一次
國際線上 CodeforcesAtCoder 每週都有比賽

競程有什麼有趣的地方?

  • 解題的快感:想出演算法的那一刻、實現它、看它 ACAccepted,通過全部測試)的感覺無敵爽
  • 無窮無盡的挑戰:演算法的世界博大精深,永遠有更難的題要挑戰
  • 全球社群:Codeforces、AtCoder 上有來自世界各地的競程者,可以和他們比試高下
  • 業界價值:多數軟體相關的行業,會用競程類型的題目來篩選面試者