1. 程式人生 > >ACM新手入門歷程

ACM新手入門歷程

首先,我做個自我介紹,大一即將轉入大二acm業餘狗,入隊七個月零25天。普通二本院校,外號皁兄。

我是偶然興趣入了這條道兒的,剛開始只想著學學C,心裡盤算著一來消磨消磨時光,二來既然選的專業屬於資訊類,反正都要學,何嘗不先試試水,沒學成,那也沒事;學成了一點半點,那裝裝B也還是可以的。

我自己看視訊敲簡單程式掌握C大概用了一個多月,後來學校的師兄(我們都這樣叫他,其實他是學校的老師,備註:坑貨的大神)聲稱學校ACM集訓隊招新人,我忍不住煽動,就去了。

因為是我負責晚自習的請假,所以我很清楚的記得,我正式入隊學習的時間是在2015年11月17日,從這個日子算到今天2016年7月12日,也將近八個月了。當時我們的水平什麼樣的呢————零基礎(從來都不知道可以用C語言在網上刷題),現在的水平呢————馬馬虎虎啦(我不細說,本人水深水淺部落格文章一目瞭然)。

好了,前面廢話了老長的三段,對不住大家了(主要是緬懷一下我這一路的歷程),接下來我們進入正題。或許在三四個月之後,就又會有一批新鮮血液接觸ACM,如果我寫的這篇文章能有幸給你帶來什麼啟發和動力,皁兄便非常滿足了。

假設,你是一個剛會C語言基礎,從來沒有接觸刷題的人,但是面前擺著校訓隊招新的誘惑,你抵擋不住,前去試水,所幸被看重(其實acm跟C語言的牽連關係小到百分之零點幾,一般學到後來都會選擇C++語言實現,因為C++輸入輸出簡單方便,而且有個功能強大的STL)。

不是我說打擊的話,學會了C語言基礎並不代表會C語言程式設計。你需要不斷練習,一回生二回熟,通過題量來累積對選擇迴圈陣列結構體函式等等的熟練運用。其次,瞭解一些程式設計的核心,其實,程式設計就是把現實中的問題通過C或者其他語言告訴電腦,讓電腦解答。具體來說,既然走了acm這條路,要起步就先習HDUacm入門PPT。會基本輸入輸出之後開始在hduoj上刷題,先刷11頁的那一百道。

如果要問我每天花三個小時,要多久就可以入門之類的問題,我真的不好說,只是你每天除了上課自習吃飯睡覺,其餘時間你都用在這上面的話,就算基礎腦袋再怎麼不夠用,一個月到兩個月足矣。

這一百道題是acm入門的必經之路,可嘆你們皁兄因為懶,刷了近乎四個月。接下來就開始著手入門的學習了。這個不用我多說,隨便百度網上一大把,先買小白跟大白(也就是一本經典一本訓練指南)。先沉下心來,看看那本紅皮書,從第一章開始看,等你看到C++的時候,你就需要一本關於C++的書開始著手自學C++了(個人建議:C++必須要學,而且最好趁早學,因為慢慢地到後來就要自學資料結構跟STL了)。

學會C++之後就跳過紅皮書中間部分,先學數學那塊,什麼篩選法、唯一分解定理、尤拉函式、線性方程組、中國剩餘定理、組合、遞推數列、概率什麼的都先打好基礎,沒完全搞懂沒關係,但是不能忘了你哪部分沒搞懂,隨著學習的漸漸深入,你需要適當地回過頭來總結,把學過但是沒學精的知識再仔細學一遍。

按照我的路子,學了數學那部分之後我就開始讓自己的大腦先停歇一會兒,開始學習字串、模擬題的內容,比如說大數、進位制轉換的問題,然後學習排序,暴力,瞭解一些遞推公式等等打好基礎準備。之後便可以在網上開始看看各位大牛的部落格,為將來的演算法學習做準備。建議可以從hdu跳槽,到POJ或者是FZU、ZOJ等等上面去做題。這個時候,給你的題目就可幾乎是英文題了,所以皁兄建議,時刻不忘學英語,不為四級也還是要為acm讀題。

基礎打牢之後就開始對演算法採用逐個擊破的的方式。我記得我是從今年四月份開始的,學習dp,水了一些題目,看了些書跟部落格,覺得必須要中斷一下了(因為水太深)。但是,我發現過早地學習dp對自己並沒有壞處,接下來我就開始學習圖論跟樹,由於我在寒假的時候閒來無事就自學了點資料結構、圖論和離散,因此後來入手也算順利。

師兄這個學期給我們搞了幾場比賽,我們在這個學期開學的時候就組好隊了,看到我們隊的比賽成績從最底層一場一場地往上爬,自己內心感觸頗多。給自己最大的教訓就是沒學搜尋,所以到目前為止,我就決定再潛一波水,對演算法再深入學習。

個人吐槽,這個坑,跳進去了在一兩年之內就很難爬出來了。