前言

跟之前提起過的一樣,我準備挖個新坑,寫寫怎麼從零開始參加程序設計競賽。

對於大部分同學來說,如果期望能看到什麼刷題祕籍,那可能是沒有的,畢竟我刷題實力不足,比參加過 Final 的 @ftiasch 之流的競賽偶像差太多了……不過在圈子裡摸爬滾打了這麼多年,當個嘴巴玩家總還是可以的,所以這系列文章主要應該會分成三個部分:

一、如何參加比賽?

二、個人應該從哪些方面下手訓練?

三、組隊應該從哪些方面下手訓練?

其中如何參加比賽的部分,可能會把初級內容和高級內容分拆出來,也可能不會,看我心情。

尷尬的是,我默認看我專欄的一般是學生,很少有老師,但很多內容其實是寫給老師的,畢竟訓練這東西靠自己能成的人總是少數,這很多時候也是所謂「弱校」難出成績的重要原因,因為方法不得當,學生更多隻能依靠自己求學,這個摸索成本就要大得多。

全系列估計會有比較長時間的連載,每一篇篇幅不長,主要是我寫作時間和能力所限,不可能能隨隨便便就編出幾萬字的東西。與此相關的是,我應該(?)開通了讚賞功能,在此說明:我不怎麼缺錢(當然也不是不缺,誰會嫌錢多呢?),這個功能純粹是想看看有沒有人對挖坑不填很憤怒,如果你表達了憤怒,我會比較羞愧地稍微……寫快一點,但不保證(噗嗤)。如果真的有人讚賞的話(目前看來可能不咋可能),在系列文章結束時我會把所得全部捐給「百萬森林」計劃,大家多呼吸一點新鮮氧氣吧(……),也歡迎反饋這個功能好用不好用(我自己是看不到有沒有按鈕的……)

關於轉載,請參考CC BY-NC-ND 4.0。商業使用的請提前聯繫我獲得許可(不聯繫使用的,律師含警告(?)。

是什麼?

既然是「從零開始」,那當然就是從介紹比賽開始講起——說到這裡,我知道很多人會開始浮現起一段話,那個被印在幾乎所有賽區的競賽手冊、新聞稿、領導講話之類地方的,什麼什麼歷史什麼什麼最具影響力的大學生程序設計競賽之類的一段話,但我想講的不是這個。

畢竟,現在有了 CCPC 了嘛(滑稽)。

而且還有天梯賽是吧(再次滑稽)。

我認為,目前意義上的,「程序設計競賽」是:

在較短的限定時間內,用計算機實際編程在嚴格的限制下解決一個或多個高度抽象的精心設計過的問題的競賽。

從這點上來看,程序設計競賽跟你的 C 語言課程期末考試可能沒有本質上的區別,如果你的 C 語言課已經是上機考的話。當然如果貴校還是紙質考試的話,歡迎瞭解一下我們的產品 (被打死

PTA | 程序設計類實驗輔助教學平臺?

pintia.cn

就我瞭解的情況來看,在這類競賽中有一些地方可能與你平時的編程練習題有一些差別:

(1)一般不用輸入所謂的「輸入提示語句」

這個陋習來自於很多 C 語言入門書都喜歡添加一些提示信息,比如 「Please input a number」之類的,學生學的時候也不太懂是個什麼玩意兒,抄上去感覺還蠻好玩,於是就動不動就 input a number 了……

然而這個東西實際上並沒有什麼卵用,尤其在電腦判卷的過程中只會浪費系統資源(參考下文),所以在一個水平比較過關的程序設計競賽中,一般不會要求輸出這類字元串。

(2)對程序的運行時間、空間有所要求

不要說學生了,很多老師一開始做題,也在問一個問題:為什麼我的程序運行超時啦?明明我樣例跑的很快,甚至是一閃而過的?

這裡就要說到軟體測試了,但是說起來好麻煩啊(我也不會)。所以我簡單的說一下,一般程序設計競賽中,要測試你程序是否正確,一般都符合以下兩個原則:

  1. 黑箱測試:不看你代碼如何編寫,只看程序對於輸入結果能否輸出正確的結果。
  2. 隱藏數據:系統用於測試你程序的數據與你能看到的數據不一致。

雖然特殊情況下這兩個規則都有可能不符合(例如第一點,我就遇到過裁判看我程序給我返回運行時錯誤,但實際上是錯誤答案的事;第二點,以前的 Google Code jam 以及提交答案類的題目都是明顯的反例),但大部分情況仍然是正確的。

在這個大前提下,出於系統資源以及考察的因素,給程序的運行設下限制是最現實也最合理的方式。舉個栗子,大家都喜歡的輸出素數,如果不設置限制,那你寫了個枚舉每個數試除的程序,範圍大點,估計到比賽完了程序還沒運行結束……

(3)對輸出有嚴格的規定和要求

前面也說到了,因為是黑箱測試(很多甚至是自動測試),因此要判斷一個程序是否正確,人或程序所要做的,就是把準備好的輸入數據餵給你的程序,然後看看你程序輸出是否正確。判定正確顯然只能與現有的「標準答案」做對比,畢竟現在人工智慧可能還沒有牛逼到可以直接忽略你輸出的「The answer is」之類的提示語句。也是因為如此,所以多個空格少個空格,或是打錯單詞有時也會躺槍,但這沒啥辦法……

為什麼?

為什麼要打這個比賽呢?我就不說那些「我感覺比賽很好玩」之類的廢話了,大家都關心實際的東西,那麼實際的東西是:

  1. 至少在現在,參加比賽的學生能夠進入好企業的概率仍然比沒參加比賽的學生大一些。

要注意的是,很多人會將上面的話理解為「程序設計競賽能夠培養選手綜合能力」之類的方面,但我必須指出這其實是不正確的——真正的事實是,現在中國計算機教育的水平之低下到了一定程度,以致於學了四年計算機(無論是計算機科學還是軟體工程吧)還無法獨立編程的學生大有人在,而企業肯定不希望花費精力去面試這樣的學生,畢竟面試的成本其實是很大的。

程序設計競賽,尤其是比較高水平的 ICPC/CCPC 競賽,是一個「篩選器」:你在這個比賽拿到了獎項,起碼你會寫程序的概率比別人要大得多,企業的招聘成本降低了。

僅此而已。

因此知乎上有很多諸如「不打比賽是不是就找不到好工作」之類的問題,我覺得顯然不是的。不過話又說回來了,你要硬邦邦寫點牛逼項目還是很有用的,但如果只是劃划水的話可能還不如打比賽呢。

2. 能夠認識很多人。

從事實上而言,目前競賽選手已經成為了很多高新創業企業的技術核心,比如圖森(TuSimple),臉艹,啊不是,Face++,依圖,當然還有大家熟知的 Pony.ai 等等公司。因此無論是在現在,亦或是將來,在圈子裡認識更多的人總是有好處的;畢竟以後工作了,你很可能來來回回都會碰到這羣人……而以我的瞭解來看,對於國內大部分的計算機學生來說,稀爛的英語水平可能也不足以支撐利用 Github 等方式進行社交的路子,因此這可能是唯一的途徑了。

3. 對老師而言……

有些學校可能承認這些獎項,有些學校則可能不承認,但無論如何,這至少是一個批量生產出路光明學生的一個路子,當學生都去了 BAT 等大公司的情況下,對老師應該是有名聲上的進展的,也可以因此建立一個良好的關係網……其他的我就不展開說了,畢竟我覺得這方面來說參與的老師肯定比我想的要清楚。我會把這部分更細的內容放到下一節裏講,盡量提供一些參考資料供老師們參考。

怎麼辦?

這就涉及到本系列文章最核心的部分了。下次再講:)


推薦閱讀:
相關文章