###### tags: `MDCPP`, `明道中學傳承` # 從零開始的競程介紹 ## 甚麼是競程? 競程就是程式競賽的簡寫,通常是比一些演算法題目的程式實作。 這是廣大資訊領域中的一小個分支而已,但對中學生來說,因為有很多專門的比賽和檢定對升學很有幫助,所以現在越來越熱門。 ## 甚麼樣的人適合競程? 競程的練習方式就是寫題目和學習新的演算法,適合喜歡思考或寫程式的人來加入。但最重要的還是看自己有沒有興趣,可以先嘗試用Online Judge解一些題目來判斷(後面會介紹甚麼是Online Judge)。 可以先參考[這部影片](https://www.youtube.com/watch?v=ueNT-w7Oluw&ab_channel=WilliamLin)的前30秒。 ## 要怎怎麼入門? 入門可能會比較辛苦一點,但只要能找一些人陪你一起練習或加入一些優質社團(~~像是MDCPP~~),一定能體會到其中的樂趣。 ### 要先學哪種語言? 首先要比程式競賽當然要會程式語言,現在最主流的是 `C++` 和 `Python`(但最通用的還是`C++`,`Python`有些比賽不能使用),**所以建議初學者先去學習** `C++`。 學習程式語言其實真的和學習一門新的語言很像,一開始會甚麼都看不懂,只能靠死記硬背,但只要撐過這段時期,程式語言也沒有想像中那麼複雜困難。而且學習完一種程式語言後,學習其他程式語言的速度也會大幅加快。 ### 學習資源 很多人可能會好奇,應不應該買書? 如果你只是要學習程式語言**語法**的話,我的回答會是**不要**。 去書店看看的話,會發現有關程式語言的書都又厚又貴。 如果你真的不信邪買了一本回家的話,大概讀不到 1 / 4,就開始拿它來蓋泡麵了(~~本人家裡就有一本QQ~~)。 這種又厚又重的書被我們稱為字典書,就真的是和字典一樣的存在,裡面雖然語法用法齊全,但還要花時間翻找,而且這些資源其實上網搜尋也能輕鬆得到,所以不建議大家買書。 要學習資源的話,上網找就能獲得很多了,這邊提供幾個比較優質的。 - [Solo Learn](https://www.sololearn.com/home) - [新竹實驗中學C++程式語言教學講義](https://hackmd.io/@CLKO/B18yT_i5Z) - [USACO Guide](https://usaco.guide/dashboard/) 第一個是專門學習程式語言的網站,而且不會一直要你付錢。 第二個是很棒的講義,後面的演算法部分也不很不錯。 第三個是美國的IOI國手做的IOI培訓專用網站,從非常簡單到非常難都有。 ## 電資圈介紹 因為下面可能會用到一些比較特殊的用語,所以先和大家做個介紹。 ### 名詞定義 **電資圈** : 泛指對資訊有興趣的中學生所組成的團體。 **電神** : 每次在比賽中都打爛你的神人,ex : ICEYLEMON。 **水題** : 泛指簡單的題目,對每個人來說可能不太一樣。 **燒雞** : 指比賽打爛,或程式打爛。 **裝弱** : 電神最愛做的事。 ### 打招呼方式 Orz  跟著做就對了,如果是電資圈的人一定會回應你的XD ### 對話範例 電神A : 我比賽又燒雞了。 電神B : 你明明就第一名,你裝弱。 電神A : 否阿你都解出我不會的題目,我超弱。 電神B : 我只會解水題阿,我更弱。 電神A : 你都把我不會的題目當水題解,你超電。 電神B : 否阿,我超弱。 電神A : 我更弱。 電神B : 我最弱。 ... ... 接著就進入無限裝弱迴圈。 ## OJ (Online Judge 系統) ### 甚麼是 Online Judge? 就是一個你可以找到題目並且上傳程式碼獲得反饋的地方,有些OJ還會提供線上比賽、題解等功能。 舉個例子,[TIOJ A+B問題](https://tioj.ck.tp.edu.tw/problems/1002)。 這是建中的OJ,上面的題目從很簡單到很難都有。 而這題就是一個很簡單的題目,點進去看後會發現他直接把程式碼給你了。 ```cpp= #include <iostream> using namespace std; int main() { int a,b; cin >> a >> b; cout << a+b << endl; return 0; } ``` 只要把這個程式碼複製並submit(提交後記得多重新整理幾次( 某匿名人士:F5非常重要) ),就會看到滿滿的綠色東西,代表你的程式碼正確(Accepted : 簡稱 AC),相信這會是你以後最喜歡看到的東西。 <a style="color:green;font-size:40px">AC</a>  <a style="color:red;font-size:40px">WA</a> 但如果你的程式碼輸出的答案錯誤,你就會拿到紅紅的 Wrong Answer。  <a style="color:black;font-size:40px">CE</a> Compile error 的縮寫,代表你的程式不能被正確編譯,通常會把編譯錯誤的訊息給你看。  上面這個例子就是忘記宣告變數 `a, b` <a style="color:blue;font-size:40px">TLE</a> Time limit exceed 的縮寫,代表你的程式執行太久了,可能需要改進。  <a style="color:gold;font-size:40px">MLE</a> Memory limit exceed 的縮寫,代表你的程式使用了過多的記憶體。   在TIOJ上MLE也包括了存取記憶體不當的情況(SE或RE),但有些則會把他歸類成下面會提到的RE。 <a style="color:purple;font-size:40px">RE</a> Runtime error的縮寫,通常是陣列開太小、遞迴太深等問題,但詳細情形太多也沒辦法簡單說清楚,是個比較麻煩的錯誤訊息。 ### 小結 上面提到的OJ回饋在不同OJ上可能都會有些許不同,但大方向都是要幫助你把錯誤的程式碼改成正確的,好好看懂這些回饋,可以減少自己的debug時間。 ## 各大OJ介紹 現在好用的OJ真的非常多,但每個OJ的優點可能都不太一樣,所以這邊會介紹一些對初學者比較有用的OJ,可以大概分為基礎和進階兩類。 ### 基礎篇 並不是說基礎篇的OJ中就不會有難題出現,但裡面會有很多題目都是為新手準備的,因此適合用來打基礎。 ### [MDCPP Judge](http://mdcpp.mingdao.edu.tw/) 我們明道中學學生專用Judge,裡面有很多練習語法的題目和一些MDCPP講師自己出的有題目,也有搬運許多NPSC的考題,而且還有許多場模擬賽可以打,雖然分類有點亂,但是個只要認真找就能找到好題目的網站。 因為不開放自行註冊,想要帳號可以加入MDCPP或是去私訊MDCPP講師。 ### [Green Judge](http://www.tcgs.tc.edu.tw:1218/) 台中女中的Judge,裡面的題目非常適合初學者,尤其是基礎題庫和初級題庫,想打好基礎的同學應該把那100題都寫完。 但網頁速度偏慢,而且只支援到 `c++98`,不支援萬用標頭檔 `bits/stdc++.h`。 ### [Zero Judge](https://zerojudge.tw/) 傳說中的水題網站,裡面雖然會有一些好題但水題仍佔了絕大多數,所以對初學者來說相對友善,可以輕鬆刷題增加信心,但不建議花太多時間在Zero Judge的水題上面。 上面會有一些學科能力地區賽的題目、模板題和Uva翻譯題還是很不錯的。 ### 進階篇 這些OJ的題目普遍都會用到演算法或一些競程技巧,有些還會定期舉辦線上比 賽。 因為內容有點多,而且可能對初學者來說可能比較難以理解,所以**初學者可以先跳過**。 ### [Codeforces](https://codeforces.com/) 全英文網站,簡稱CF,幾乎每個禮拜都至少有一場比賽,難度分為div1, 2, 3(從難到簡)。 幾乎所有打競程的人都會使用的網站,打完比賽後會有 Rating(排名分數),有時候會作為一個衡量一個人實力的方式,但也不一定完全準確。 CF比賽的題目有時候偏向腦筋急轉彎或是奇怪小技巧,所以如果轉不過來的話就會打不好,建議新手不要太把Rating當回事,等有一定的實力再去想辦法提升Rating就好。 ### [Atcoder](https://atcoder.jp/home) 全英文網站,或者也可以看日文,也會有線上比賽。 現在的比賽通常都是 - ABC (Atcoder Beginner Contest) - ARC (Atcoder Regular Contest) ABC的前三題都是非常水的題目,第四題通常也不會太難,第五題通常是經典演算法或資料結構題,第六題之後就會變得相當困難。 就算新手來打也至少能解個三題,所以相對於Codeforces的比賽,我比較推薦從ABC開始打。 ARC的難度就比較浮動,但整題來說會比ABC難。 打完比賽也會排Raiting,但比較少人在意。 之前還有AGC,是比ARC還要難的比賽,現在很少出現了(出現了應該也打不了,Rating要求很高)。 ### [CSES](https://cses.fi/problemset/) 也是全英文,對提升實力非常有幫助的一個網站,每個主題都分得很清楚,題目也有按照難度排序,而且都是很經典的題目,可以配合[CP hand book](https://usaco.guide/CPH.pdf)一起使用。 ### [TIOJ](https://tioj.ck.tp.edu.tw/) 上面有介紹過,這是建中的Judge,裡面會有許多電神自己出的題目,也會有一些TOI初選、模考、還有近幾年全國賽的題目,總之是建議在有一定實力之後再去刷裡面的題目。 ## OJ使用守則 上面提到了這麼多OJ,如果能有效率的運用每個OJ,實力一定會突飛猛進。 ### 刷題 刷題也分為很多種,第一種是隨機刷題,這是在對大部分資料結構、演算法都有一定了解後會比較有用,有些OJ會用難度分類,可以選自己適合的難度然後隨機亂選,選了一題之後可以設個思考時間,超過思考時間之後如果還是完全沒想法就去看題解。 第二種是主題式刷題,就是選一個主題開始大量寫同種類的題目,這會讓你對那個主題的了解更加深刻,如果要進行主題式刷題的化可以上網找題單,或去和一些電神們要題目。 ### 補題 如果你是喜歡打線上賽的人,但每次打完之後不會去把沒打出來的題目補完,那建議你不要再花時間打線上賽了,因為你都只打你會的題目,這樣進步會非常緩慢。 所以建議大家,一場比賽如果解了3題,**至少**要去把第4題也解出來。線上賽通常都會有詳細的題解,所以不用怕寫不出來。 ### Virtual 這個詞源自於CF上的一個virtual功能,可以讓你自己選時間打一場已經結束的比賽,現在衍伸成打模擬賽的意思。 這對熟悉比賽狀況,練習臨場反應都非常有幫助,可以在各種比賽前找考古題來和朋友們一起virtual。 ## 比賽資訊 既然是程式競賽,當然會有很多比賽,每個比賽都有自己不同的特色和獎品,而且是可以和其他電神一起競爭的機會,一定要好好把握。 初學者一開始參加比賽可能都會被電得很慘,但還是要鼓勵大家多去參加,也是個認識一些其他學校的電神和他們交流的機會。 比賽介紹順去大致上是由基礎到進階。 ### APCS 嚴格來說這只是檢定,但實作題目內容和競程題目一樣,都是演算法和資料結構的題目。 實作題總共有4題,難度大致分布如下。 1. 第一題,需要會使用迴圈。 2. 第二題,需要會雙層迴圈,通常程式碼會偏長,要有一定的實作能力。 3. 第三題,會出現演算法和資料結構,想法開始變難,程式碼通常不會太長。 4. 第四題,比較有變化的題目,也一定會用到演算法或資料結構,要靠自己實力的累積和一點運氣。 還沒學算法的初學者可以挑戰先打出前兩題,學完算法之後再挑戰3, 4題。 APCS最難的地方在於,你寫完程式不會給你即時的反饋,到最後你可能會發現你的分數比預期的低,所以在寫實做題的時候一定要注意,多自己寫一些測資去測試程式碼。 對於已能夠打出APCS前兩題的同學,可以參考吳邦一教授編的[APCS實作題從三級到五級](https://drive.google.com/drive/folders/10hZCMHH0YgsfguVZCHU7EYiG8qJE5f-m),是非常好的一本講義,如果能全部看完且寫完習題,一定可以拿到五級。 ### YTP 少年圖靈計畫,精誠資訊所辦的比賽,傳說中的佛心比賽,只要通過線上初賽,就可以參加有免費的披薩、炸雞的現場決賽,名次高的隊伍還可以獲得獎金和參加製作專題的機會。 沒錯,這是團隊賽,三個人用一台電腦,和大學端的ICPC比賽賽制類似。 ### TOI 初選 這是在國高中階段打競程的人最想打好的一個比賽,因為這個比賽會選大約20位同學和學科能力競賽的前10名進行第一階段選手培訓,如果能繼續打進去第2階段,幾乎能保證可以不用考試直接上台大資工,對升學很有幫助。 但這個比賽聽起來就很難啊,怎麼會放在這麼前面講。沒錯確實是很難,但建議初學者也一定要去參加,對於**高一以下的學生**還有**女生**,會提供保障名額,要好好把握機會,進到選訓營一定會收穫非常非常多。 沒有被保障的學生也別氣餒,只要努力練習一定有機會靠自己的實力打進去。 要參加初選的條件是通過海選或有APCS 3級以上。 ### 資訊學科能力競賽 分為校內初選、地區複賽、全國決賽,全國決賽的前10名可以進TOI選訓營。 校內初選和地區複賽的題目都是各地區和學校自己出的,所以無法保證難度和題目品質,像是台北複賽就會競爭得非常激烈。 但比到了全國賽就會好很多,還可以去住飯店😍,題目也非常有趣。 ### NPSC 台大辦的比賽,題目整題偏難,大部分都是之前的IOI國手所出的題目。 也有分線上初賽和決賽,決賽的獎品真的非常棒,雖然要拿到也是非常困難。 這也是團隊比賽。 ### IOI International Olympiad in Informatics的縮寫,也就是國際資訊奧林匹亞,簡稱資奧。台灣每年只能派四個選手出去比賽,大家可以往這個目標努力看看。 ### 大型線上比賽 #### [Google Kick Start](https://codingcompetitions.withgoogle.com/kickstart) 每年有8場,每場四題,前三題可能和APCS實作前三差不多或更難,第四題難度浮動很大。 #### [Google Code Jam](https://codingcompetitions.withgoogle.com/codejam) 一年一度的大比賽,從資格賽一直到總決賽,要一場一場打,如果排名在範圍內才能晉級,時間對台灣人比較不友善,有時候賽程剛好在上課時間根本沒辦法打(請公假也許是個不錯的選擇),不然就是在半夜或凌晨,但就題目來說還是非常不錯有趣的,而且打得好的話會有T-shirt。 #### [FB Hacker Cup](https://www.facebook.com/codingcompetitions/hacker-cup/) 賽制和Code Jam差不多,也是很值得打的比賽。 ## 比賽總結 其實還有非常非常多比賽,要自己小心留意,不要錯過了報名時間才後悔,所以建議大家多去追蹤一些電神的FB帳號,或是加入一些社群,隨時關心最新的比賽資訊。 打這些比賽很多時候也不一定是想要拿個好成績,更多時候是覺得有趣,並且和他人交流的一個機會,建議大家可以先多去試試看,一開始一定會被電爛,不要覺得丟臉,每次被電爛時也同時慢慢累積自己的實力,有一天也會換你去電別人。 ## 學習資源統整 - [Solo Learn](https://www.sololearn.com/home) - [新竹實驗中學C++程式語言教學講義](https://hackmd.io/@CLKO/B18yT_i5Z) - [USACO Guide](https://usaco.guide/dashboard/) - [APCS實作題從三級到五級](https://drive.google.com/drive/folders/10hZCMHH0YgsfguVZCHU7EYiG8qJE5f-m) - [CP hand book](https://usaco.guide/CPH.pdf) - [STL 教學講義](https://tioj.ck.tp.edu.tw/uploads/attachment/5/12/1_2.pdf) 要看完上面的資源應該就會花費不少時間了,尤其是下面三個,如果真的能全部看完打進出TOI一階一定沒問題了。 下面再提供一些資源,可以配合著做使用。 #### 其他學校培訓講義 - [版中講義](https://sites.google.com/site/pcshic/zi-xun-pei-xun) - [建中講義](https://tioj.ck.tp.edu.tw/articles/5) #### 競程百科 - [OI wiki](https://oi-wiki.org/) - [CP Algorithms](https://cp-algorithms.com/) #### 電神的網站 - [wiwiho 的競程筆記](https://cp.wiwiho.me/lessons/) - [蛋餅的競程隨筆](https://omeletwithoutegg.github.io/) - [雞塊的競程隨筆](https://www.jikuai.codes/) - [iceylemon 的程式小空間](https://oosheepyerd79135.gitbook.io/iceylemon_cp/) - [Sshwy's Notes](https://notes.sshwy.name/) 最後一個是大陸的神人,但大陸神人的blog真的太多了,而且有些真的很可怕,建議大家小心使用。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.