刻苦的訓練我打算最後稍微提一下。主要說後者:什麼是有效地訓練?
我想說下我的了解。
很多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不是智力測試,不是你什麼都不做就可以天上掉餡餅的。當然我不是說題目一定要做多少多少道,但如果你覺得你可以一心二用,從機率上來講,你百分之九十地錯了,我是個工科生,我相信機率而非奇迹。