一位ACM過來人的心得

小黑妹發表於2012-08-15

刻苦的訓練我打算最後稍微提一下。主要說後者:什麼是有效地訓練?

我想說下我的理解。
很多ACMer入門的時候,都被告知:要多做題,做個500多道就變牛了。其實,這既不是充分條件、也不會是必要條件。

我覺得一般情況下,對於我們普通學校的大學生,各方面能力的差距不會太大,在這種情況下,訓練和學習的方法尤為重要。

其實,500題僅僅是一個標誌,而且僅僅表示你做ACM-ICPC有一定的時間,

我們訓練的目的是什麼?我覺得有四點
1、提高程式設計能力
2、學習演算法
,(讀書,讀論文,包括做一些題目驗證)
3、準備好面臨將到來的挑戰(熟悉題型,調整心態)
4、啟發思維。

這裡四個目的,從訓練的角度上,重要性逐次遞減;為什麼呢?
因為前面的因素是後面的基礎。而是後面的目的,想達成越為不易。我覺得前3者能保證你ac掉你能做的題,即使難題始終不會做,也可以ac掉中等偏難的題目。

而需要一定思維難度的題,要以前三者為基礎而且屬於訓練的後期,中期只能作為偶爾調節。當然,我思維也爛得要死,對這點沒什麼發言權,大家可以鄙視我。

我這裡想主要說下第2點。

對於演算法,我發現,很多我們這樣的弱校ACMer選手沒有側重好演算法的學習。
下面要講的幾點,可能都很老套,但我想以035對比我自己的例子給大家做說明。

<1>演算法學習是ACM比賽所要推廣或者要提倡的一個方面
記得曾經路過某人的blog,上面說他作比賽的時候遇到了一個dijkstra,他沒做出來,然後評論到(大意):我才不會花時間去搞明白“這種”演算法。 “這種”也許有可能是指:沒什麼實用性,對吧,這樣我就不想評論了(又是有關科學和工程的討論)。但起碼有一點需要明確的:ACM-ICPC比賽時關於電腦科學的比賽,電腦科學是演算法的科學,計算機演算法中dijkstra有著重要的實際和啟發意義,所以比賽一定要考。
你參加這個比賽,要拿獎,就必須學習這種演算法。你也許覺得你智商很高,但ACM-ICPC比賽本身不是智力比賽,比賽就是要讓你去學習這些東西,所以,如果你不想學的話,我覺得也沒有必要參加。說道這,可能偏題有點遠,但是希望以上的分析能得出這樣一個基礎結論:不想學好演算法,那沒有必要來比賽。

<2>用模板是不好的
現在很多我們弱校的ACM-ICPC選手比較依賴模板,說實話,我也很依賴,但是我起碼知道一點,這樣是不對的,某種意義上說,這是你沒有把演算法學明白的一種表現。而且也嚴重影響編碼速度。在我見過的huicpc035參加過的比賽中,他從來沒有看過模板,全部現場敲,有一次比賽有個圖強連通分量+縮點+染色+什麼的題去了,我在他們機房做,我則抄模板,結果總共敲了1個半小時,而035明確演算法之後,啪啦啪啦,估計30多分鐘就敲完了。這裡順便八卦一下他:我和kevin以前去湖大集訓隊玩的時候,給他取了個外號——打字猛男(他應該還不知道)。因為他敲鍵盤的聲音特別大特別快,呵呵。

我覺得他敲程式碼的時間沒有浪費,某牛曾說:因為每次敲都有可能有不同的錯誤,所以不用模板是好習慣。我最開始學dancing link的的時候,自己敲出了程式碼,然後接下來的幾道題部分參考了以前的程式碼,後來基本上是直接copy。現在,當別人問我dancing link演算法或有關的題目的時候,我已經是一臉茫然。

所以,用模板是不好的,有時候由於某些原因可能你用了模板,但你起碼要知道這要做是不對的,並且有機會要改正。

<3>需要深入學習
像 ACRush、zzy、ahyangyi...等等國家隊的天才們,本身難以說我們與他們之間有什麼可比性。但是他們的學習方法應該還是值得借鑑的,他們的學習方法當然我們得不到言傳身教,但是從他們在國家隊集訓的論文中和他們搞完ACM-ICPC以後的軌跡中,可以有所體現。那就是:深入學習。

其實這點我來講可能還是不夠有力,因為我這方面也很欠缺,我儘量說下我的想法。

首先,覺得ACMer學演算法不應停留在看看程式碼實現這個層面,在演算法思想上要有清醒的認識,在正確性分析上要也應該要有較好的邏輯。因為網上的程式碼的實現上的一些細枝末節很可能掩蓋了演算法本身有的簡潔性、美感和思想。因而喪失了對演算法整體上的一些認識。還拿dijkstra演算法打比方,有些演算法不是基於 dijskstra的直接建模,而是需要你修改這個演算法,這時你對演算法沒有真正理解的話,也就一籌莫展了。

我為什麼老說Dijkstra演算法,因為確實很多人都只知道用模板,而且模板還不好,在我看到的Dijkstra實現中,只有czyuan_acm的程式碼寫得好。不是說其他的不對,但確實是有問題,投機取巧了的。

所以,要閱讀論文和書籍,尤其與英文書籍,窺到它的本質。另一方面,只有這樣,你學的的東西才能在ACM-ICPC以外,給你一定的啟發——否則你會迅速忘掉它的。

據我所知,035起碼閱讀了幾十篇集訓隊論文,orzorzorz,而且切掉了例題。

<4>獨立思考
這點我也很慚愧,因為我也是缺乏獨立思考的。很多題我不會了就去搜解題報告,所以反而我的搜資料能力變得特別強。035和許多大牛在這點上做的比我好多了,他們遇到題不會的時候,也不會很急於把題目做出來,可能每隔一段時間又拿出來想一次,總有一天想通了,之後這一型別的題目基本上也就沒有什麼問題了。

而我恰恰比較“虛榮”,做到的題目不會不太願意想太久,就想盡量快些AC,於是急於看解題報告,這樣導致的一個問題就是有些重要的東西解題報告中沒有提到,而我也沒去想就把他們忽略了,這樣,我還是不會做。我和035討論問題的時候,我不會一般就直接找他要程式碼,但是他不懂的時候,頂多問我大體的思路,而絕對不會要程式碼的。

在去年ACM賽區尾聲的時候,我發現035做中難題的能力已經明顯超過我一個檔次。看他現在做的題目,已然是相當變態,幾乎是都100以下人ac,這些題目我看了基本上沒什麼想法,更要命的時,解題報告也搜不到。035目前的狀態讓我想起一個人,不知道大家知道不:wangfangbob,他切bt題的能力也是令人汗顏的。

<5>做有意義的題
1.是不要做水題,這裡的水題定義為:一眼就能看出做法,而且中途的實現可以預計沒有太多問題的題目。
2.是做能夠強化你最近學到的東西的題目
3.你不會但你應該會的題目。
這同時也是在說,某些沒太多代表性的題目可以少做,因為對比賽幫助不大。(當然我這個參加比賽的目的很功利,非功利主義者另當別論)剛才,我把我在poj上的號和他的號對比了下,他ac而我沒ac的基本上是難題,我ac他沒ac的一般是水題,看得我想哭,5555。

補充一點:ac的人多的並不一定代表著水題,有些幾千人ac的題目,在現場賽中ac的人很少,這樣的題目往往是有一定思維難度且編碼不難的好題,這種題目要認真做,某個學長說:經典的題目啊,只有那麼多,做一道,就少一道。

<6>估算好某種訓練所需要的時間
我覺得我學網路流就是一個例子,我在大概賽區賽之前2個月開始學習網路流,1個月前開始學習費用流,但是對於我來講,這兩個月培養出來的網路流思維還是不夠(雖然也做了不少題),特別是,這種題目往往作為中難的題目出現,不會讓你隨便水的,於是,北京賽區的那道網路流當時就沒有想出來——功利地說,學習網路流沒有得到好的效果。

所以,現在來看,當時其實我可以不搞網路流。如果要學一種比較有難度的東西,並且還必須把他搞好,應該較早地,全面地學習,必須長期的訓練以培養這種思維。打個比方,如果你微積分平時不學,僅僅考試前一週狂做題目,我覺得上90分是很困難的。
當然,這要根據個人情況而定,我的理解能力應該說是中等水平,如果牛的話應該可以更快地學好。

<7>有關訓練的度
我有時候通宵刷體,這裡我不知道huicpc035有沒有這個習慣,不過我通宵的時候沒見到他通宵。
我覺得其實通宵刷體,或者太長時間地做題,還是不好的。我們為什麼會這樣有熱情的做題呢,因為我們有興趣;但是一個人的成功不僅僅依賴於興趣,還要依賴於自控。這和打遊戲是一個道理,遊戲太有趣以至於我們常常通宵——ICPC題目也太有趣,所以有時候通宵。而且很多時候是,由於一道題AC不掉,所以賭氣一定要搞定才睡覺,這樣一不小心,就通宵了。
其實我明白,通宵不一定效果好,這僅僅說明了你興趣很高漲而已。通宵往往會打亂你的時間安排,打亂你的生物鐘,進而影響你短期或是中期的訓練計劃。而且,疲憊的狀態下做題,你往往只有ac題目的慾望,而完全喪失了ac題目的靈氣。所以,我建議,ACMer一定要合理安排作息,能夠自控,這樣不僅僅對你做 ACM-ICPC有好處。
總之,有效訓練是很重要,只有通過有效的訓練你才能獲得你參加這個比賽應得的東西。

還有就是,除了035以外,另一個值得大家學習的就是richardxx——我也很佩服,我並不覺得他是天才,我覺得他以全方位的努力讓他自己變得優秀,大家看他的blog可以看到他的學習歷程。

最後要說下刻苦訓練這一點,這個我主要想說給我們學校的acm隊員:
客觀的說,我們學校很多名校落榜生(我相比而言是水進的)。確實都蠻聰明的,但再聰明也比不上ACRush吧?人家可是SGU都切滿了!ACM不是智力測試,不是你什麼都不做就可以天上掉餡餅的。當然我不是說題目一定要做多少多少道,但如果你覺得你可以一心二用,從概率上來講,你百分之九十地錯了,我是個工科生,我相信概率而非奇蹟。

我覺得035這方面也是值得我們學習的,我比較喜歡扯淡,有時候聊題目的時候也經常不小心就去扯其他話題去了,在學習的時候,035是堅決不多聊亂七八糟的東西的,除了討論上QQ,平時據我觀察都是殘酷地訓練。現在回想起來,我有點後悔,QQ上和網上花掉的時間用來學習新的東西,也許結果會更好。

ACM-ICPC絕不是大學生活的全部,也不是搞演算法的全部,你大可以花時間去做其他研究,做專案,或者參加學生工作(我更欣賞那些對人生和職業有良好規劃的ACMer);但是,如果你搞ICPC的那段時間你不是全部投入,那的在ACM-ICPC生涯中,將只有後悔。

相關文章