我是個中年人,我與小學生巨佬們同台競技

  • 2019 年 12 月 18 日
  • 筆記

(0)報名篇

去年國慶,我感受到命運的召喚,開始專門研究信息學競賽。

到了今年八月底,NOIP改革成CSP-J/S,不再限制只有學生才能參賽。

那個時候我沒有想過要不要去參加。近一年來,我主要的精力都用在了小學信奧教學方案的探索上。信奧里的不少知識點挺難的,比如圖論、動態規劃之類,更何況如果要向四年級的小學生解釋這些知識點,需要花很多的時間來鑽研。

到了九月底的時候,發生了兩件事,第一是我終於把整個教學體系設計得差不多了,第二是我看到朋友圈裡有一對父子一起去報考CSP-J。這個時候離報名截止時間很近了。我就在猶豫要不要也去參加認證。後來想到了一點,就非去不可了–CSP-JS考試環境跟其他的比賽環境差別比較大,經常有人問我考試環境。我之前是根據相關的文檔來推測整個考試環境的,雖說也能推測個八九不離十,但是如果能實地體驗一次的話,那麼我就會有最直接的現場經驗。

報名後,最大的問題就出現了:題我不會做。我雖然天天接觸信奧,但是研究「教」跟研究「做題」差別很大,雖然兩者也有關係。我的做題量很少,有些簡單的題我也不一定能做出來。雖然我有辦法向很小的小學生解釋較複雜的問題,但那是因為我提前花了很多時間做了分析。

有些人懂得很多,但沒辦法表達出來,而有些人懂多少就能講多少。會做不等於會講,會講也不等於當場能做出來。

初賽最好的複習方法當然是做近十年的真題。那些真題先前我已經做過一遍了。我當時的計劃是再做一遍。不過等到考試時,並沒有實現這一目標。

(1)初賽篇

初賽時我碰到了兩位認識的小朋友,他們跟我在同一間教室。真是緣分。

監考老師有倆,一老一中年,看起來都比較面善。

初賽是機考。考試的頁面有點卡,但對做題影響不大。

考到一半的時候,有個子很小的小朋友(應該是小學生),突然問老師能不能用DevC++編譯器。這個時候我已經用了老長時間的編譯器了,計算器也使用了多次。並且我早注意到,身邊的多數小朋友早打開了編譯器。小朋友這麼問是可能是因為膽子比較小。倆監考老師面面相覷,問小朋友啥編譯器,顯然兩位老師都不是信息老師。我說規則上沒規定不能使用,就表示可以用。很多小朋友附和說對啊對啊可以用可以用。老教師說既然如此,那就用吧。然後那個中年教師出去問了人,回來跟大家說再強調一次可以使用。

考完之後,我才聽群里的人說,有些考場不允許使用編譯器。估計是有些監考老師不懂,又怕承擔什麼責任,所以就不讓用了。

對於能力很強或很弱的選手來說,用不用編譯器,差別不大。但對於多數人來說,用編譯器比不用編譯器,還是有優勢的,比如變幻矩陣那題,我大體上知道該選哪些答案,然後把程序複製後往編譯器里粘貼,把答案一填,運行一下,立馬就知道自己肯定都選對了。其他一些不會的題,即使把代碼都複製到編譯器里,我還是不知道填什麼答案。有人說可以把答案挨個枚舉一遍,事實上這是不太可能的。比如最後一道題有五個空,每空四個答案,需要嘗試4^5 = 625次。等你嘗試完,早就收卷了。有人可能會認為假如三題會做兩題不會做,這樣只要嘗試4^2 = 16次就可以了,但我覺得編程題恐怕不容易出現這種情況,編程題更常見的是基本都會或基本都不會。

五道大題里,有兩題我會,有兩題不會。還有一題大體上看得懂。壓軸題考二維數據的計數排序,幾個月之前我還給小朋友分析過一維數據的計數排序。但是考試的時候,我驚訝地發現我把計數排序的思想忘得一乾二淨了,就記住了「計數排序」這個名詞本身。

前面選擇題也有一些不會做的。考完後我估摸着自己能超過65分。同時我根據去年的初賽情況估算今年的初賽分數線不會超過60。

過了幾天我再次做初賽題的時候,發現了一個神奇的現象,有些題我在考場上,無論如何都想不出來,但是重新做的時候竟然能秒懂。我推測這是因為不同環境導致的結果。

隔了幾天出了成績,我發現自己竟然有80多分。比我估算的多出不少。我推測是跟平時深入鑽研每一個知識點有關係。類似於語文或英語中的「語感「,編程可能也有「程序感「,」程序感「助我靠近正確答案遠離錯誤答案。

(2)複賽篇

初賽之後,我沒能立馬準備複賽。因為我需要解析初賽試題。在我所做的所有事中,這事是最耗時的。因為我的目標是把所有的知識點都解析到四年級的小學生都能明白的程度。這花了我整整一個禮拜的時間。然後再處理一些其他的雜事,又是一個禮拜。

這時我考慮要準備一下複賽了。我清點了一下之前做過的題,除了做過近年北京市的一些小學生的比賽題外,我在洛谷上只做了50題。這個量太少了。半年前有一個小學生巨佬做了五百多道。

學信奧的第一條原則,不能做題太少;第二條原則,不能漫無目的搞題海戰術;第三條原則,等我想到了再告訴你。

最後兩周陸陸續續做了一些題,到了考試前,洛谷上做了65題。

複賽是在一個中學的圖書館,場地比較寬敞,分為三個區。有好多位監考老師。

第一題非常簡單,比去年的第一題要簡單,多數人在10分鐘內就能做完。第二題剛開始看覺得不難,但後來做起來發現不簡單,是一個比較複雜的模擬題,需要用到隊列結構。難度跟2012年的第二題「尋寶」差不多。我本想用一下標準模板庫中的隊列,不幸的是沒成功,後來改用vector,不幸的是有個方法名稱記不住了。最後我只能用數組模擬了一個類似隊列的東西,才通過了測試樣例。做完之後發現時間已過去兩個小時半了。這時我切身體驗到做題少的劣勢了–會導致做題又錯又慢。後面兩題我在考前就預期做不出來,儘管平時我有辦法讓小朋友清晰地理解歷年的後兩題,但是我自己經常不會做,或者沒辦法在短時間內做出來。我做了一會兒沒做出來,就放棄了,有一些測試點如果深入思考有可能可以通過測試,但這對我來說也沒什麼意義。第三題有兩個測試數據是能一眼看出結果的,我順便寫了一下。然後我又花了很多時間驗證第二題。

在做題的過程中,我無意中用鼠標碰到了桌面的頂部,感覺到上面有東西,點擊了一下,VMware的工具欄出來了!這時我才明白,原來系統不是直接裝在硬盤上的,是通過VMware虛擬機安裝的。我將虛擬機縮小一部分,立馬看到了Windows系統和DevC++。這是個不小的發現。我從來沒聽人說過考場里用的是虛擬機,估計很多人都不知道。考後幾天我和一些小朋友討論起這事,他們不知道有虛擬機的存在。

到了結束的時間點,監考老師讓大家把手放下,不允許再觸碰鼠標和鍵盤。我旁邊一個小女孩,估計是小學生,很遺憾地跟我說最後修改的一小點東西沒能保存下來。然後就是等待收代碼。有不少考生在聊天。

考試的過程中,發了一張紙,上面要寫明哪些題的代碼提交了哪些題的代碼沒有提交,並且需要要簽字。考試結束時,監考老師叫考生挨個到收代碼的電腦前看自己的代碼提交的對不對,並上繳簽名的那張紙。在叫我之前,我注意到有個監考老師挨個電腦收考生代碼,具體是把代碼從NOILinux系統拉到Windows系統里,再從Windows系統里把考生的代碼傳到收集代碼的那台電腦里,這也是個不小的發現,之前從來沒聽說過是這個流程。

我走到樓下的時候,有個監考老師快速跑下來,叫住了我前面的一個小女孩,說她的文件夾位置錯誤。看樣子是叫她回去改文件夾位置了。這個老師挺好的,如果文件夾位置沒改正確,就是0分。每次考試都有些考生因為文件夾名稱或位置錯誤而得0分,這真是令人遺憾。

(3)賽後篇

考完之後我聽說今年的普及比去年的簡單。我因為後兩題不會做,沒看出最後兩題的難度。過了幾天我又找時間做後兩題,每道花了半天的時間才做出來。這時我才發現,確實是今年的題比去年的簡單。第三題看起來比第四題要難一些,但是感覺難度區分度不夠大。以前多數年份,四題之間的難度是直線上升的。

不久就出現了幾個可以估分的平台,我在兩個平台上估算了一下,比我在考場里當場估算的都要高上那麼一點。後來實際分數出來的時候,我發現我的分數跟我考場里估算的分數是完全一樣的。同時發現少數人的實際分數比估分高,多數人的實際分數比估分低,有些人甚至低大幾十分的。這是因為估分平台的數據不如官方數據嚴格。

12月9日出了分數線,我剛剛好過了線。這有很大的運氣成分。這次的第二題是恰巧碰到我會做的類型,加上我反覆計算和驗證才做對。如果換種題型我不會做也很正常。做題少是不可能取得好成績的。我所知道的所有算法強的人,做過的題都是非常多的。

最初我參加這次認證考試,主要是為了知道整個考試流程,現在看來,我獲得的收穫遠不止於此。