本篇開始主要介紹國內(nèi)大學(xué)生的算法方向的競賽。
ACM國際大學(xué)生程序設(shè)計競賽是最負(fù)盛名的大學(xué)生程序設(shè)計競賽了,其全稱為International Collegiate Programming Contest,簡稱ICPC,由Association for Computing Machinery(國際計算機(jī)學(xué)會)主辦。國際計算機(jī)學(xué)會簡稱ACM,計算機(jī)科學(xué)領(lǐng)域的最高獎圖靈獎就是由ACM評選出來的,而由ACM主辦的ICPC自然保證了權(quán)威性和含金量。正因?yàn)槿绱耍ヂ?lián)網(wǎng)的頭部企業(yè)十分青睞在ACM/ICPC中表現(xiàn)優(yōu)異的選手,而在ACM/ICPC中脫穎而出的選手,許多已經(jīng)在學(xué)術(shù)界和產(chǎn)業(yè)界取得了巨大的成就。
事實(shí)上,ACM/ICPC是幾乎所有頂尖OI選手到大學(xué)之后的自然選擇,許多NOI集訓(xùn)隊選手、IOI金牌在大學(xué)階段也同時拿到了ACM/ICPC全球總決賽的金牌,比如教主樓天城、陳立杰、金策等。所以算法競賽真的是可以從小學(xué)一直打到大學(xué),也許除了數(shù)學(xué)競賽可以做到之外,也沒有任何一門學(xué)科競賽可以如此具有延續(xù)性了。
歷史淵源
令人意想不到的是,在程序設(shè)計發(fā)展的早期,上世界70年代,就有了程序設(shè)計競賽——1970年在美國德克薩斯A&M大學(xué)舉辦了首屆比賽,然后很快得到美國和加拿大各大學(xué)的積極響應(yīng)。1977年,舉辦了首次總決賽,并演變成一年一屆的國際性比賽。
賽事早期,由于參賽隊伍的地域所致,冠軍基本上是美國和加拿大的大學(xué)獲得,1990年以后,開始有美國以外的國家奪冠,而進(jìn)入21世紀(jì),冠軍基本上被俄羅斯壟斷了。
至于我們中國,上海交通大學(xué)于2002年美國夏威夷,2005年中國上海,2010年中國哈爾濱三次獲得全球總決賽冠軍,浙江大學(xué)于2011年在美國奧蘭多奪得全球總決賽冠軍。有些出人意料地是,壟斷了NOI集訓(xùn)隊選手、學(xué)生整體水平最高的清華大學(xué)和北京大學(xué),雖然金牌拿了不少,但是一次也沒有獲得過全球總決賽冠軍,即使是樓天城、陳立杰、金策等人,也在ACM/ICPC總決賽上留下遺憾,其競爭之激烈可見一斑。
賽事體系
由各大洲區(qū)域賽(Regional)和全球總決賽(World Final)構(gòu)成,區(qū)域賽一般是每年9-12月舉行,全球總決賽則安排在次年3-5月,只有在區(qū)域賽中表現(xiàn)優(yōu)異,才有資格入選全球總決賽。
比賽賽制
ACM/ICPC與OI雖然都是算法競賽,考查的知識點(diǎn)和能力有很大程度上的重合,但是在賽制上有較大差別。
第一個差別是參賽隊員。OI是個人賽,ACM/ICPC是團(tuán)隊賽。ACM/ICPC參賽隊伍最多3人構(gòu)成(理論上也可以1個人作為一支隊伍,據(jù)說樓天城就干過這事,然后一個人吊打全場,樓教主的威名于是傳播開來),一支隊伍只提供一臺電腦。所以ACM/ICPC相比OI,多了團(tuán)隊直接的配合,更接近真實(shí)的工作環(huán)境。
第二個差別是題量。NOI和IOI每場比賽都是5個小時3道題,ACM/ICPC則是5個小時7至13題不等,所以盡管是團(tuán)隊賽,但是題量的增加,還是非??简?yàn)選手的解題能力以及團(tuán)隊配合的默契。對了,ACM/ICPC是全英文題面,即使是國內(nèi)的區(qū)域賽,也只提供英文題面,而IOI還可以由領(lǐng)隊翻譯為中文題面提供給選手。當(dāng)然,優(yōu)秀的算法競賽選手,英語(至少閱讀)都是不會差的。
第三個差別是評分機(jī)制。OI是按測試點(diǎn)評分,ACM/ICPC則是按通過題目數(shù)量和用時進(jìn)行評分。在OI賽制下,一道題目如果無法寫出規(guī)定時限內(nèi)的正解,是可以根據(jù)數(shù)據(jù)范圍特點(diǎn)寫部分分的。ACM/ICPC則要求一道題必須通過所有測試點(diǎn)、得到Accpted,該題才算通過,否則就是WorngAnswer等其他反饋,沒有部分分。ACM/ICPC這樣的評分機(jī)制也有現(xiàn)實(shí)意義:登月程序必須完全正確,才能保證飛船進(jìn)入正確的軌道,總不能允許一個幾乎完全正確的程序,導(dǎo)致飛船最后偏離了些許軌道,最后飛向太陽系的其他地方吧。
當(dāng)然,配合這樣的評分要求,ACM/ICPC是有即時反饋的,一道題目提交以后,是否通過都會即時反饋,一道試題可以反復(fù)提交,只不過每一次錯誤的嘗試,都會增加罰時。國內(nèi)的OI比賽沒有即時反饋的機(jī)制,選手必須自己評估所寫程序的正確性,直到考試結(jié)束才會測評。在這一點(diǎn)上,ACM/ICPC又顯得更為友好,也更為有趣,每通過一道試題,官方就會在該隊伍的桌上掛上相應(yīng)顏色的氣球,顯得非常好看。而在前4個小時里,可以看到全部隊伍的實(shí)時排名,顯得非常刺激;最后一個小時封榜,無法看到排名,留足了懸念;比賽結(jié)束后的最后滾榜,又是激動人心的時刻。
第四個差別,OI是閉卷考試,ACM/ICPC則是開卷考試,允許攜帶紙質(zhì)參考資料。所以ACM/ICPC理論上是不需要背誦算法模板的,可以把更多的精力放在思維層面而不是記憶層面。但是優(yōu)秀的隊伍都會事先編寫準(zhǔn)備適合自己代碼風(fēng)格的模板,只有適合自己的碼風(fēng)用起來才順手。
盡管ACM/ICPC與OI在賽制上有比較多的差異,但是畢竟都是算法競賽,所以O(shè)I的頂尖選手,在ACM/ICPC上也是能很快適應(yīng)的,只要解決配合的問題,其團(tuán)隊實(shí)力往往也是頂尖的。甚至每年一些OI強(qiáng)校(例如杭州學(xué)軍中學(xué))派出的中學(xué)生隊伍參加ACM/ICPC區(qū)域賽,取得了金牌乃至全場冠軍的優(yōu)異成績。