1. 程式人生 > >ACM 生涯指導 先轉過來 心情好再看!幹他!

ACM 生涯指導 先轉過來 心情好再看!幹他!

今天看了一篇我們學校前輩的ACM的感悟,覺得寫的十分有道理,這裡轉載,文章還會不斷的改進和更新。

宣告:本文是寫給弱校ACM新手的一點總結,受自身水平和眼界所限,難免會有一些個人主觀色彩,希望大牛指正

感謝@ 、@ 、  @ 的指教,現根據這些建議,文章已進行修改

先簡單介紹一下自己:

  高中在OI打過一段時間醬油,大一後暑假進入ACM集訓隊,到大三寒假,總共一年半的ACM生涯。

  總共參加了四場比賽:區域賽一銀(2013長春)一銅(2013杭州)一鐵(2012金華),省賽狗血一銀(2013山東)

  總共有過5位隊友

個人感覺SDUST ACM集訓隊的最大缺點就是經驗得不到傳承,幾乎每一屆都是從零開始,我們11級更是這樣

下面是我一年半以來根據平常對11級隊員習性的瞭解和各個隊員最後的興衰得出的一些經驗,當然這些規律是到最後才發現的,要是早就知道並一直堅持的話,我也不至於現在這麼水-_- !

不適合搞ACM的型別:

書呆子型別(包括一部分學霸):把ACM當成學演算法,演算法步驟一個一個都記得很熟,刷題時一個題一個題的摳,無論是看書或刷題都非常認真,進度不快不慢,很多學霸專業課能學得很好,但不一定適合搞ACM。我只想說,好好的學你的專業課去吧,你丫的搞什麼ACM?

還有就是數學思維能力很差的,學數學就是記公式背定理,典型的“文科生”

我見過ACMer的常見幾類:

天才型:(這個在咱們學校基本不存在),所以就不用考慮了-_- !

依賴題解型:思考問題一想不出來了就想上網搜題解,缺乏獨立思考的過程,“伸手黨”,刷題很多但思路很板,這種人很難有自己的想法,不會成為主力

思路型:刷題較慢,喜歡獨立思考(尤其是思路題),很多時候自己AC以後才查題解,為的是拓展思路,尋找不同的解法,當然不是一點不看題解,有些題目不看題解是做不出來的,有的技巧不看題解也不會知道,只是沒有依賴題解,每個題目都是認真思考後確定實在不能做再去查題解,且刷完一個專題花一些時間去總結,也喜歡看別人部落格裡的專題總結,這種人早期學習進度較慢,比賽屢屢受虐,是別人眼裡的弱渣。後來隨著自己獨立思考量和經驗的累加優勢逐漸顯現出來,“有自己的想法”,基礎打好了以後一直在鑽研難題(第二本書上自己負責的專題的難題能獨立刷個大部分),最後成為隊裡的主力(不過一些博友說這種人後期很難突破極限,沒有深入研究理論,沒有站在巨人的肩膀上,好吧,只能說我們太弱,還沒到那個階段,或者這個也要看他練的專項吧)。

理論型(也是個人比較推薦的型別):數學等理論研究的很深,讀過幾本有深度的理論書,數學思維很強,金牌隊伍確實需要這樣的人,我身邊還沒出現過這樣的人,我個人感覺能力得先達到一定程度(比如說銀牌)再去深入研究這些理論,要不你可能吃不消,能力未到就算你看懂了也未必會運用。我所見到的都是能力未到的、剛開始接觸這一部分就拋開lrj的書在研究其他理論書的人,比如說第二章剛開始刷就在看組合數學和數論方面的厚厚的書,結果大都摔死了。個人建議:如果你的目標是金牌或更高,後期隊裡至少要有一個深入去研究這些理論的,如果你的目標是銀牌或更低,讀讀國家集訓隊論文這些理論衍生品就夠了,這種人強隊必須得有但不建議早期就搞。

一般型:同大多數人一樣,按部就班的刷題、看書、看部落格,寫部落格一般不去總結或很少總結(寫題解基本就寫一兩句話再貼上程式碼就完事,我只想說你這樣的題解還不如不寫),沒有花樣(提起花樣,我就有一個效率潔癖、很多時候在OJ上做題、很多題目就算AC了我也會一直去優化,直到優化到不知道再怎麼去優化,時間排名前幾,這樣雖然浪費時間,但是收穫還是挺多的),沒有或很少有“自己的想法”,多少有點經驗主義,估計到最後很難成為最突出的那幾個,就看個人努力程度和個人天賦了,除非你非常拼或有點天賦或堅持的時間比別人長。

個人感覺    ACM水平=Σ思考量*難度 + 經驗的累積 + 一點點天賦

而不是簡單的題數的累積,當然題數至少要達到一定量才能入門,只看書不刷題=紙上談兵

ACM是打著演算法的幌子在比腦子

依賴題解是練不出來“腦子”的,那樣的思維是別人給你的,沒有自己的想法,獨立思考才能提高自己的戰鬥力,面對中難題才能“有自己的想法”

很多時候題目涉及到的演算法很簡單,但是思路很難,或者根本就不涉及演算法,因此 ACM!=演算法競賽

但這並不代表你可以不學演算法只刷題,學習演算法可以很好的鍛鍊你的思維能力,放棄演算法你很難走遠

遠離題解不是不看別人的東西,那樣單幹屬於閉關鎖國,除非你是天才,否則不會搞出什麼名堂來。遠離題解是讓你不要對題解產生依賴,不要一想不到思路就去查題解,最好是實在沒有思路再去看,這個度自己去衡量。尤其對新手來說,懂得知識非常少,很多時候根本無從下手,可以適當的去查題解。別人的經驗還是要借鑑的,多看別人的總結,尤其是一些優秀的部落格。

Codeforces和Topcoder很重要!

最專業的衡量你的ACM水平的不是你的題數,不是你的省賽成績,不是你的區域賽成績,是Codeforces和Topcoder的rating

因為比賽成績受很多方面影響,且一年只有那一兩次機會,成績不一定能代表自己的水平

但是Codeforces和Topcoder可以,這兩個比賽都是國際性的,幾天就會有一場比賽,全世界的ACMer都在上面做題,題目質量非常值得肯定,且上面的題目一般都是純思路題,很少涉及演算法,能很好的體現和鍛鍊你的思維能力,很重要的一點,你可以看別人提交的程式碼,可以找找世界冠軍級的人的程式碼看看,找找差距

Codeforces和Topcoder rating = 最專業的思維能力+程式設計能力和速度的衡量

其實第一本書的東西不必全看,刷個大部分就行了,第一本是基礎,提高還是靠第二本書,其中第一章必刷,如果有能力,第三章也必刷,其他的裡面再選一章搞就可以了,第二本的練習題很有價值,如果你有能力,建議不要放過裡面的難題(能獨立完成收穫到的肯定是最多的)

另外,我也非常推薦《挑戰程式設計競賽》這本書,由於我快寒假的時候才買這本書,退役以後只是寒假裡看了一部分,發現這本書很不錯,很多地方講的比lrj的書更通俗易懂,比如說字尾陣列,我看一遍就能看懂,但很多地方不如lrj講的有深度,這三本書大家選擇性閱讀吧。聽說上海交大的幾本書也不錯,不過難度偏大,不適合新手

如果你搞某一方面搞不動了,可以先看點別的,不要一直死磕,因為你的能力還沒到,其實隨著你不斷的刷題和比賽,思考,你的能力一直在提高,就像Topcoder和Codeforces曲線所顯示的那樣,比如說你現在看第二本書的某個地方死活看不懂,你可以先去搞點別的,等到你能力增長了一塊,再回來看,發現很容易就能搞懂,這是你能力增長的最直接的體現

--------------------------------我是分界線----------------------------------

下面是對有一定基礎的同學的建議(刷完第一本書的大部分和第二本的一兩章以後)

書上面的題刷完以後,多搜些專題總結和別人的經驗看,況且有很多專題書上根本就沒有。比如舉個栗子,動態規劃有太多的種類,樹形DP,概率DP,狀態壓縮DP,數位DP,插頭DP。。。以及一些優化技巧,斜率優化,四邊形不等式優化,單調佇列優化等。每一個都是一個專項,都夠你研究上一段時間,但同時這些知識也是非常實用的,這些裡面有很多專題如果你不主動去尋找就很難遇到的,一般我尋找的途徑就是看別人的部落格的時候通過看別人部落格的標籤或部落格裡提到的新名詞,然後我就會去搜索一下,看它到底是什麼東西

舉幾個栗子,斜率優化DP推薦這篇:

四邊形不等式優化DP推薦看這篇:

單調佇列優化看這篇:

樹形DP看這篇(極好,題目最好全做做):

這樣的專題總結性的文章不光介紹專題知識,還有推薦的題目,看完後一定記得做做。

有些部落格總結是非常經典的,比如說資料結構方面的神作:

如果你刷完你負責的專題,最後連這個專題誰的部落格寫的最經典你都不知道,只能說明你練的深度不夠

如果你負責動態規劃專題,如果你只刷完兩本書上的動態規劃就完事,最後連斜率優化,佇列優化都不知道,你還練個毛的動態規劃

這裡只是舉個栗子,只是一小部分,並不是全部,希望大家養成自己主動搜專題這種習慣

另外,數學方面,推薦幾篇極好的論文,曾經給過我很大幫助的

國家集訓隊論文是筆寶貴的財富,吊絲逆襲的利器  

都是IOI國家隊隊員所寫,大部分都是經典,新手不建議看,知識儲備到一定量後讀讀這些論文對能力的提高有極大的幫助,極大的擴充套件你的視野,一定要細讀,上面的題目都要做做。(但也不是所有的集訓隊論文都值得讀,質量還是有差別的,不過非常經典的集訓隊論文還是很多的,能給你很大的啟發)

這裡有1999-2009國家隊論文下載地址:

這裡有最新的:

因論文數目太多,可以只挑自己專題內的或自己感興趣的讀

還有就是要多打比賽,因為比賽中學到的東西或許比你刷題得到的還要多,不光是知識,還有各種經驗的積累

上面這些你做到了,估計你的水平已經到區域賽銀牌了

----------------------------------------我是分界線--------------------------------------------

如果你想更進一步,請看下面

最後有時間有能力的就去讀劉汝佳的黑書吧,新手一定不要讀,對新手來說既浪費時間又沒多大作用

隊裡一定要有個人去深入的研究一下數學理論,讀一些數學原著,很多論文現在滿足不了你了,可能對你來說現在原著更有味道

另外,還有一個建議,就是上面這些順序不要跳著來做,第一本還沒刷完就不要去看第二本,第二本書一章還沒刷完就不要去整專題,還有我不止一次的看到有人剛刷完第一本書或第二本剛刷了一點就去看黑書了,跨度太大,能力還未到,就算你當時能看懂一部分又有什麼用,終究白費力氣

不要一口吃個大胖子,除非你是個天才,否則你吃不消的

我上面說的這些如果有人都能做到的話,估計他會是SDUST ACM歷史上空前的大神

最後,我們為什麼要參加ACM?

蘿蔔白菜,各有所愛,興趣是最好的老師

無論你當初以什麼樣的目的進入ACM,能堅持下去就是好樣的

比賽結果並不重要,重要的是過程所帶給你的,證書或許只是一張廢紙,唯一剩下的只有那更強的思維能力和程式設計能力和你的意志,大學裡能把一件事做好並把它一直堅持下去是件很幸福的事情。而且可以肯定的說,參加個一兩年的ACM,你的思維能力和程式設計能力絕對不可同日而語,尤其在我們弱校體現的更加明顯。

當然,參加不參加ACM也不重要,金子在哪都能發光,不過在弱校很難得到這麼好的鍛鍊機會。

最後希望SDUST ACM集訓隊越走越遠