[爆卦]高中生程式競賽是什麼?優點缺點精華區懶人包

為什麼這篇高中生程式競賽鄉民發文收入到精華區:因為在高中生程式競賽這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者Y78 (Y78)看板Soft_Job標題Re: [請益] 請問國中生程式設計競賽入門時間Tue...


※ 引述《peanut97 (丁丁)》之銘言:
: 遇到一個國三生,有輕微亞斯伯格症,對電腦、程式非常有興趣。
: 應該說,只讓電腦進入他的世界。
: 家人已經放棄讓他以課業升學。
: 他想要做一個瀏覽器、想要修改Android作業系統,喜歡Linux環境、
: 喜歡MAC。唯獨程式語言不太會。
: 我正在教他PHP網頁。
: 未來想幫助他往「程式設計競賽」方向走,但是程式設計競賽好像比較硬。
: 請問「程式設計競賽」,有沒有比較好入門的方向呢?
: 對未來要走軟體的國三生來說。

版上有許多大大與一些我十分敬佩的學長也有在逛這個版
如果有哪裡講錯麻煩站內信或推文指正一下 <(_ _)>

先從「程式設計競賽」這件事情開始談起好了
先來了解一下有哪些程式競賽、贏了程式設計競賽可以幹嘛

因為國中生可以比的實在是很少,所以以下我所提到的都是國高中生
大部分都是高中生才能夠參加

1. NPSC
http://contest.cc.ntu.edu.tw/npsc2015/schedule.asp

台大舉辦的比賽,每年一次,有分國中組跟高中組
分初賽跟決賽,初賽是線上賽,在家裡或是任何有電腦的地方都可以比
初賽過關之後比決賽,要去台大計算機中心比賽,有好吃的點心跟餐盒
題目的話可以自己上這個網站找一下歷屆題目

國中組的題目一般來說不會太難,有一些字串處理或是模擬題
難題大概是DFS(深度優先搜索)BFS(廣度優先搜索)跟最短路徑
(參加的年代有點久遠,所以我不太確定)

高中組的題目難度就高了許多,DFS, BFS, DP(動態規劃) 都是基本
可能會出現一些比較特別的演算法,或是網路流(flow)、計算幾何之類的題目

我參加 NPSC 是從國二到高二
我高二是大概五年前的事情,所以算是有一點遠了
但 NPSC 我覺得滿不錯的,而且是少數國中生也能參加的比賽


2. 北市賽(地區賽)
http://contest.tp.edu.tw/?id=1412135239
升上高中以後,多一個地區賽可以比,我比的是台北市資訊能力競賽
我們都簡稱北市賽,其他的我記得有中區跟南區,東部跟新北我就不是很確定了
北市賽有名額限制,如果同高中有太多人想參加,會先比個校內賽(學校自己辦)
獎項分成四種:一等獎*5、二等獎*5、三等獎*10跟入選獎
前十名(也就是一二等)可以參加全國賽

這我高一有比過,有分成筆試跟上機
比重好像是30%跟70%,這我不太確定

3. 全國賽
各區的前十名來比
這我沒參加過所以沒什麼可以講XD
全國賽的前十名可以保送TOI(等等會講)

4. 台北市軟體競賽
http://tpc.taivs.tp.edu.tw/
高中高職都可以比,組別也不同
高中組題目跟其他比賽大同小異
我高二有參加過,那時候是在松山工農比

5. TOI
TOI就是臺灣資訊奧林匹亞研習營Taiwan Olympiad in Informatics
http://toi.csie.ntnu.edu.tw/

聽到奧林匹亞就覺得很厲害,因為這真的很厲害
上面講過,全國賽前十名可以保送這個研習營
另外20個名額會再舉辦一個入營考招生
進去以後一共30人,我們稱之為第一階段,簡稱1!

1!會到師大住兩個禮拜培訓,每天都上一些資結/演算法的課
每個禮拜都會有一個小考試,會決定你能不能到第二階段(俗稱2!)
我高一的時候有進1!
在裡面生活滿愉快的,因為吃住都不用錢,而且學校那邊可以請公假
請兩個禮拜公假XDDD

1!的大約前12名可以進2!,然後再培訓兩個禮拜
最後取前4名,就是國手了,就可以參加 IOI 國際資訊奧林匹亞
http://toi.csie.ntnu.edu.tw/main_01.php?ID=17
每年舉辦的地方都不一樣,2014在台灣辦過


以上五個就是高中生基本上可以參加的競賽
其中最重要的當然就是TOI
為什麼呢?因為如果你夠強當上國手然後有拿牌,可以保送任一大學的資工系
你想去台清交成任何一間都可以

如果沒有前四名,但你進2!而且名次在滿前面,也可以靠推薦的方式去推資工系
這個推薦跟學測指考都沒什麼關係,是另外一個特別的管道

所以,如果你把資料結構/演算法練到超級猛但是國英數超級爛,還是可以進112資工
但這種人極少而且超極端XD

談完了資訊競賽有哪些,來談談這些比賽考什麼跟計分方式
每個比賽大概會有六題以上,基本上都用英文代號,也就是pA, pB, pC, pD, pE...
答對叫做AC(Accept),答錯叫做WA(Wrong Answer)
超時叫做TLE(Time Limit Exceeded),其他還有一些我就不再贅述

一般的比賽時間大概都三個小時起跳
每一題的得分是:答對時間 - WA次數*20,沒答對的話則這題不加分不扣分
比賽的時候會有即時計分版,選手也看的到;但比賽結束前一小時會封盤
現場比賽的話滿好玩的,只要答對一題就會送你一顆氣球
你看誰前面氣球多就知道誰最神XDD

考試類型的話就是大家所熟知的資料結構/演算法
http://www.csie.ntnu.edu.tw/~u91029/ 列出了許多有用的東西
通常會用一個很生活化的方式包裝題目,讓你覺得比較有趣

像是這一題:http://tioj.infor.org/problems/1026
其實就是考你二進位轉換,但把題目包裝過
有些題目很好玩包裝的很好,你拆一拆之後會恍然大悟:阿!原來是這個!
就是那個 moment,會讓你覺得超級有趣(至少我自己這樣覺得XD)

或是這一題,http://tioj.infor.org/problems/1143
說穿了就是 BFS

或這一題:http://zerojudge.tw/ShowProblem?problemid=b127
題目落落長,但看穿了其實就是費式數列


講了這麼多,終於可以回到正題
程式解題這件事情,你要引起他的興趣的話,我覺得可以從兩個方向
第一個就是從利誘下手,跟他說「你這個很強的話可以保送台大資工喔」
第二個就是讓他真的愛上這些解題的過程

怎麼做?先讓他解一題看看
你先去各個online judge看一些答對率比較高的題目
找一題自己覺得有趣的又不會太難的,然後叫他解解看
解完了就再找一題,盡量找一些有趣一點的,試著引起他的興趣

或是你可以直接拿一些經典題,一步一步引導他
例如說經典的背包問題:
你現在有一個容量是100公斤的背包
你有一堆物品,每一項都有一個價值V、重量W公斤
每一項物品都只有一個,也就是你只能選擇拿/不拿
你要怎麼選擇,才能讓你拿到的價值最高?

我有一個原則是:先求有,再求好
一個最簡單的想法是:我窮舉不就好了嗎?
如果有n個物品,一共有2^n種拿法,保證可以找到解答

這時候可以順便帶入時間複雜度的概念
問他說:那如果n是10000的話怎麼辦?2^10000電腦跑不動耶
那就要想有沒有更好的解法
一步步提示他,接著一起完成這一道題目

光是背包問題就有一堆可以繼續延伸
像是剛講的0/1背包、無限背包、二維背包等等
有興趣的可以參考背包問題九講:http://love-oriented.com/pack/

除了這個,也可以教他最短路徑
最短路徑就有幾種不同的演算法,每一種的思考方法都不太一樣

或若你覺得這些太難,就從排序法開始吧
泡沫排序、插入排序、快速排序、合併排序、桶子排序...
每一種都有各自的想法跟想解決的問題

二分搜也是一個很好的入門
你可以說:現在你有1000個數字,如果我要問你:500在不在裡面,你要怎麼做?
他可能會回答:就從第1個掃到第1000個阿
接著你問說:那如果我要問你很多次呢?500, 501.., 600, 700在不在裡面?
他可能會回答:跟剛才一樣,每次問都掃一次
你就問說:那有沒有更好的方法呢?假如我們排序以後,會變怎麼樣?

話說我覺得用終極密碼來講二分搜還不錯,兩個有異曲同工之妙XD

如果以上都太難,就從一些基本的字串處理之類的開始
可以參考acm的一星題:http://luckycat.kshs.kh.edu.tw/
或是一些online judge比較多人答對的題目
寫完之後切記,一定要上傳!
為什麼?因為答對會超有成就感!成就感也是很重要的一部分
藉由這種線上解題系統,就可以增加成就感,而且有些還有排名
讓你知道你這題時間第幾名、code的長度第幾名
有時候會為了縮code長度用一些奇淫技巧XD

一步步引導,從慢到快,從無限制到有限制
從這些過程試著引起他對程式解題的興趣
試圖讓他為「阿!原來可以這樣」的感覺感到興奮
一旦引起他的興趣,他應該會沉浸在這樣的世界裡面

像是有一題我就覺得超級有趣
http://tioj.infor.org/problems/1513
你有一個數列,除了一個數字以外兩兩成對,找出那個數字
數列長度<=100000,0<=數字<=2^31

例如說:1 2 3 2 1,答案就是3
0 0 0 777 0 0 0,答案就是777

這題就很適合先求有再求好
你可以 sort 之後比a[i]跟a[i+1],但你發現這樣不夠快
你可以 map 存起來之後檢查,但你發現這樣記憶體耗太多
正解是什麼就留給大家思考,我自己是很愛這個簡單但神奇的解答

最後附上一篇強者我學長的文:Re: [討論] 所以練acm都底有啥好處?
https://www.ptt.cc/bbs/Programming/M.1411474900.A.746.html


--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.67.187
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1451998694.A.9BA.html
ccpz: 那些比賽飲食通常很豐盛,一不注意就是吃吃吃XD 01/05 21:08
ccpz: TOI的規則現在不知道如何, 當時有年級保障, 高一有努力過也 01/05 21:11
ccpz: 有機會進 01/05 21:11
Y78: 我那時候也有,高一保障四個,現在就不太確定了 01/05 21:12
ccpz: 能力夠的話,其實也可以直接去刷 google code jam 01/05 21:16
ccpz: 不過時差比較麻煩orz 01/05 21:16
Eric0605: 推 這篇文章可以m了 01/05 21:58
jinmin88: 最後那題感覺只是有沒有想到的問題 不過XOR的確很神奇 01/05 23:30
Bencrie: 新北有。我是還沒升格前有參加過,那時候完全無法跟北市 01/06 01:13
Bencrie: 比。 01/06 01:13
hsnuonly: 哭哭 有點後悔高中沒去打比賽 01/06 01:29
lNishan: map 是 O(log n)吧? 01/06 12:33
lNishan: 身邊好多例子是大學才開始的 現在也很強耶 01/06 12:35
lNishan: 心態跟態度才是最重要的 01/06 12:35
KJFC: 推 01/06 12:47
fenzang: 我們那年代TOI跟北市賽沒token, 一次定生死XD 現在有toke 01/06 19:50
fenzang: n之後互動題就多起來,然後greedy幾乎沒有活路了XDD 所以 01/06 19:50
fenzang: 我覺得方向還是有一點點改變啦~ 但是本質還是一樣就是了 01/06 19:50
※ 編輯: Y78 (61.216.67.187), 01/06/2016 19:59:07
jenny2921: 專業推 所以國中就只有NPSC嗎?我也只想得到NPSC耶~( 01/07 00:37
jenny2921: 還有google code jam應該也是不限年齡XD) 01/07 00:37
viper9709: 推~感謝分享 01/07 23:36
vgod: IOI國中其實就能參加,只是台灣沒管道讓國中生進選訓營... 01/11 16:01
devilangel: 也歡迎參加HP主辦的CodeWars 11/29 00:00

你可能也想看看

搜尋相關網站