從OI談起
提到OI,也許很多人並不清楚這是怎麼一回事。對於在學校就學習過數學、物理、化學和生物的同學們來說,「國際五項學科奧林匹克競賽」中的這四門是相當熟悉了(相對OI來說)。而OI/信競/計算機競賽又是什麼?聽名字跟計算機有關,他們不會是修電腦的吧!
OI,全稱Olympiad in Informatics,指的是"資訊學奧林匹克競賽",是一項在中學生中廣泛開展的一門學科競賽,和物理、數學等競賽性質相同。OI不考修電腦,不考ps不考使用ppt製作檔案編輯……(當然順便學一下LaTeX還是很資瓷的_(:з」∠)_)。實際上,OI考察的內容是通過編寫計算機程式,運用演演算法和資料結構知識,解決一些實際問題。
差不多是這種「實際」問題
可見,OI題目的實際考察內容還是知識本身,正如理化生競賽要考察大學知識一樣,OI的主要內容同樣是大學中的有關內容(中學有什麼演演算法知識嗎[捂臉])。相對來說,OI對於程式語言本身的掌握要求就很淺。總的來說,OI的題目更偏重理論和數學層面。
OI競賽的形式也獨樹一幟,你需要根據題目的要求寫一段程式,評測並不是有人盯著程式碼一行一行看,而是採用黑箱測試,共有多組資料,每組輸入資料後只要在規定時間內輸出正確結果就算通過,最後根據所有資料的情況確定分數,可以說沒有任何主觀因素的影響。
THE SECOND
關於OI的特點
OI有很多比賽,其中較關鍵的兩項為全國青少年資訊學奧林匹克聯賽(National Olympiad in Informatics in Provinces,簡稱NOIP、聯賽)和全國青少年資訊學奧林匹克競賽(National Olympiad in Informatics簡稱NOI、競賽)。NOIP相當於省賽,由全國統一命題,各省自定分數線;NOI則是全國賽,會分出金銀銅牌和集訓隊
OI作為程式設計競賽,自然對程式設計能力有著一定的要求,但這並不是什麼很高的門檻。對於初學者來說主要有兩大難題:一是程式設計思維,二是經驗與習慣問題,這都是可以通過做題解決的,畢竟OI又不是工程開發。除去寫程式碼的部分,OI與數競有很多相似之處(因此同時搞數競和OI也是可以相互促進的選擇)。OI的知識點不多,更多考察的是掌握理解、問題分析,甚至是臨場應變的能力。某位老師曾說過:「競賽是智者的遊戲。」但其實在OI中,除去少部分智商碾壓的大牛,通過勤奮積極而有效的學習同樣可以取得理想的成績。
NOI系列賽事是在激烈的高考競爭下升學的一條捷徑。如果在清北的冬/夏令營中發揮不錯或NOI等比賽中取得較好的成績,就可以拿到相應的降分。在NOI中拿到銀牌,就可以簽到復交等學校的一本線。即使重心不放在OI上,拿到NOIP省一的價效比也是很高的,畢竟省一是諸多學校自招的敲門磚,而雙省一的價值也遠遠超出單科省一,而目前在本省拿到OI省一的難度是遠小於別的競賽的。
某位不願透露姓名的hzy學長就曾經在拿下OI省一之後順便進了個CPhO國家集訓隊
參與OI不僅能為升學助力,還能極大地提升計算機水平。也許之前你是一個電腦小白,但在經過OI的學習後,你也許已經對計算機的原理有所瞭解,你也可能熟練地掌握程式設計技能,你以後還可以在大學的相關課程上刷分。畢竟在現在,程式設計是幾乎很多學科都繞不過去、離不開的。如果你打算進入EECS方向學習,OI基礎更會讓你受益匪淺。而且,OI中鍛鍊的嚴謹的邏輯思維能力無論在高考、競賽還是在日後的學習中都相當重要。
THE THIRD
關於OIer的能力
學習OI的過程,除了具體知識點,就是一個不斷做題的過程,從線上題庫、模擬賽到真正的比賽,你將一直和題打交道。但學習計算機競賽也是一種「應試教育」,畢竟大家直接的目的還是在賽場上考到高分,而臨場發揮是相當重要的。因此,OI需要重點練習三個方面:
1. 對知識的掌握和對題目的分析能力。OI涉及到許多種演演算法和資料結構,理解其原理、實現和有關技巧是每名OIer的基本功。但是OI賽場上極少出現「裸題」,也就是直接使用某種方法就能做出的題,更多的題需要深刻的理解和巧妙的思路,運用某些演演算法和資料結構作為工具來完成。如果你沒有超高的智商,那麼不得不說這是離不開大量的刷題的,有了大量的做題經驗後,一來你對很多演演算法的理解更深刻了,二來你解構題目運用演演算法的能力也會更強。
2. 程式碼能力。程式碼能力說白了就是把想法實現為具體程式碼的能力。程式碼能力的強弱直接制約著一名選手的水平,因為OI比賽中時間是非常寶貴的。提升程式碼能力同樣沒有什麼捷徑,只有不斷去寫一些看似很麻煩的題才能逐漸提高。
3. 臨場發揮的能力。OI的賽制為每場5個小時(NOIP為3個半小時),3道題,每道題根據不同的做法有不同的部分分,NOI、NOIP均為2場(冬令營、APIO等為1場),最終計算總分。每一道題都要經過讀題,想做法,程式碼實現,偵錯和最終的對拍,由於分數高的做法較為困難,每道題往往還要寫n>=2種做法用來保底。因此看上去漫長的5(3.5)個小時其實是不太夠用的。如何分配時間、高效地測試,都要在一場場的模擬賽中逐漸掌握。
THE FOURTH
幾條建議
上面已經很多次提到,學習OI沒有什麼捷徑,但是卻有可能繞彎路。投入大量時間、精力卻收不到成效,的確是一件很讓人苦惱的問題。因此,這裡有幾條小小的建議:
1.一定要高效地做題。高效不是指速度快,而是指有收穫,比如做完這道題能讓我熟悉這個演演算法的模板,或者能讓我有一些新的思路,或者能提升程式碼能力。總之一句話,不做無意義的題。
2.正視模擬賽,把每一場模擬賽當作正式比賽來打。這不是什麼態度問題,而是真的只有這樣才能鍛鍊自己分配時間、寫部分分、對拍等能力。
3.學會調整心態。在賽場外,你可能因為訓練影響文化課學習而焦慮,可能為怎麼努力也趕不上一些大神而苦惱。在賽場內,你也可能因為一兩道題導致心態爆炸,比賽崩盤。不是一切都會順利,你需要一顆大心臟。
4.及時確立高中規劃。具體到OI上,就是要不要把重心放在OI上,要不要停課,什麼時候停。這需要你對自身的實力有著清晰的瞭解。切忌兩頭放不下,最終不論競賽還是高考都不盡如人意。
5.如果最終的成績還是不理想,沒有關係,這只是漫長人生中一個微不足道的小插曲,你的眼前還有一片更廣闊的天地。