1. 程式人生 > >轉載-我對ACM初學者想說的話

轉載-我對ACM初學者想說的話

1  演算法學習

       ACM演算法的學習,一般看劉汝佳的系列書籍即可。初學者需要看的書是《演算法競賽入門經典》(俗稱小白書),或者可以看《演算法競賽入門經典(第二版)》(俗稱紫書)。理論上說,紫書的質量比小白書高得多,小白書介紹的內容紫書都有講,紫書還增加了介紹C++語法的一個章節。但是紫書的題目相當靈活,對初學者來說未必簡單(不要因為我這麼說就以為小白書的題就容易了),大家可以都先看一看,最後再抉擇精讀小白書還是紫書,當然最好是紫書。下文我用《入門經典》來統稱這兩本書。

       等《入門經典》學到一定程度,就能結合《演算法競賽入門經典——訓練指南》(俗稱大白書)一起看。大白書有一定難度,不用著急入手,把《入門經典》的基礎打紮實,就已經是一位能獨擋一面的ACM選手了。而且大白書涉及方方面面的知識點,一個人根本學不完,一般都是跟隊友配合,每個人負責不同模組的題目的。

2  程式語言學習

       理論上上面三本書足夠大學裡,從入門到真正的大神,整個ACM生涯的學習了。這三本都學完的神人我就不說什麼,只能ORZ了。這裡我想對那些一上手連《入門經典》都看不懂或很吃力的同學,補充一些話:

       這是很正常的現象,不用自卑。你首先應該先反省自己是不是沒有練題光看書,那樣看得懂才怪。程式設計是實踐性很強的學科,光看不練再有天賦的人也學不會。說到這,不免吐糟學校不允許大一新生帶電腦的制度,這對計算機專業的同學來說,相當於教你怎麼打仗,卻不允許你帶槍。不管怎樣,大家想辦法克服環境,自己創造機會去多練習C語言。因為演算法比賽雖然是比演算法,但程式總是要用C或C++寫出來的,想法再好,比賽的幾個小時寫不出程式,也是零分。而很多人一開始看不懂《入門經典》,也很大一部分是語言基礎不好的原因。

       關於C語言的學習,最經典的入門書籍是《C Primer Plus》,比譚浩強的書強的多,但因為知識系統,內容也多得多。譚的書不用讀的太細太認真,否則是在浪費生命學一些錯誤的東西,那本書用來應付期末考和計算機二級考試即可。要真想學好C語言,就把我推薦的這本書先讀完。以後你們自然還會接觸很多其它C語言經典書籍。

       C學的差不多,就可以學C++了。C++比C語言難得多,但想成為一名合格的ACM選手必須要掌握紮實,其重要性初學者以後就會有體會。C++的入門經典是《C++ Primer Plus》,有一定基礎後,可以結合看另一本鉅著《C++ Primer》。C++雖然知識很廣,但很多語法和特性在ACM中是用不到的。儘管如此,能精通的人受益匪淺,所有的程式語言都是有聯絡的,學懂C++後將會一通百通。

       C++語法學的差不多後,遇到不懂的問題要學會多查文件。文件的內容系統,而且比你網上亂搜到的東西準確多了。說是C++,其實C語言是C++的一部分,所以文件也包含了C語言的內容。

       ACM一般都允許使用JAVA語言,很適合用來做高精度題,這個初學者先不用顧慮,至少等知道什麼是“高精度”再說。JAVA的效率不及C++,一般也就只能做做效率要求不高的高精度題。

3  練題與競賽

       普通同學,先把C的基本語法學好再說,確保書本上或老師佈置的作業會做。接著在學校oj(請用校內網登陸)上刷作業或簡單題,然後可以看看一些難度中等的題目,結合《入門經典》的前兩三章一起練習。

       有一定基礎後,就可以練習校oj上的難題。《入門經典》也會推薦大量UVA上的題目給大家做,初學者一定要多練,能全部完成當然是最好的,一道都不肯練的人我勸你還是別來acm協會了。

       與acm相關的賽事非常多,從簡單到難的都有,適合不同能力層次的同學。我先介紹個人賽,這些個人賽都是中文題,除了藍橋杯是完全封閉的“考試”,校賽是允許攜帶不限量的紙質資料的。

       首先是校內的選拔賽和每年12月的校程式設計大賽。自己出的選拔賽題,目的不同,難度不一,就不做介紹了。校程式設計大賽難度不大,想在這項賽事取得成績的,可以多做校OJ上的題,把往屆賽題全部做完的,完全有能力拿一二等獎。三等獎的名額也非常多,將品(jin)豐厚,歡迎各位踴躍嘗試。

       其次是藍橋杯系列賽事,藍橋杯首先要校內預選,題目也是官方出的,這個我沒參加過不了解。校預選中獲得名額後,就可以參加藍橋省賽,省賽獲得一等獎後可以去北京參加決賽。藍橋杯的題目有結果填空題、程式碼填空題,程式設計題,難度也不高,而且本一和本二的學校是分開競賽的,減少了很多強大的對手,我們校去年有十多人進入決賽。想在這項賽事取得成績的,可以多在官網刷題(估計過了校預選的同學才有資格進入),另外有個很好的網站有收集藍橋杯方面的題目:酷記事

       下面要介紹的才是真正有含金量的賽事,都是三個人的團體賽,全英文題,比賽時每支隊伍只有一臺電腦,5個小時,一般10道題左右,允許攜帶不限量的紙質資料。

       首先是福建省程式設計大賽,難度對我們學校也比較合理,每年至少派5支隊伍參賽,要拿銅並不是很難,好好學習發展,拿銀也是沒問題的。主要對手是福州大學,福大是我們省內ACM實力最強的學校,在世界總決賽拿過第19名的佳績。要在這方面取得成績的同學,可以多在FZU刷題(福大的程式測評平臺,那裡也有往屆的賽題)。

       最後要介紹的就是所有這些比賽的鼻祖,和ACM賽事名稱的由來:ACM/ICPC,國際大學生程式設計大賽,我們都簡稱acm,然後很多其它衍生的賽事也常常直接說acm。世界總決賽,一般說final賽,我們目前完全沒有能力進入,只能視訊直播看各路神牛的精彩表現。要進入世界總決賽,就要在亞洲區預賽拿到金獎,而我們能進入並且拿到銅,能力已經比較不錯了。亞洲賽區有很多,在中國目前有六個賽區。亞洲區預賽一般簡稱區域賽,也有說現場賽的。那麼不考慮final賽。對我們來說有三個賽事:邀請賽、網路賽、區域賽。六個賽區這三個賽事都會舉辦,要在邀請賽、網路賽打到名額,才能去對應賽區的區域賽。邀請賽要去現場比,網路賽則在自己學校隨意,故可以每人一臺電腦,甚至準備電子版資料刷題,但千萬不要作弊,如不同隊伍間分享程式碼,組織方是有防作弊手段的,查到將會嚴懲。也因為網路賽更自由,所以題目難度大於邀請賽。故初學者一般先嚐試邀請賽的題目即可,這些題目,全部可以在hdu(杭州電子科技大學測試平臺)找到。hdu也是我國最有名的oj之一,網路賽等都是在這個oj進行。

       比賽之外,需要大量的練習。如果閒上面提供的oj太雜了,可以去VJ,用一個賬號,可以在fzu、hdu、uva等多個地方刷題,而且能看到大量別人分享的程式碼。如果你的瀏覽器登陸不了,可以試試谷歌瀏覽器。

       有了隊伍的同學,也應該經常在一起多進行一些模擬競賽,另外每年暑假也有有一定難度的暑期多校集訓。

4  總結與擴充套件

       當你在acm道路上奮鬥一兩年後,你學到的不僅僅是演算法知識,非常強的實踐(碼程式碼)能力,更是自學能力,對事物洞察力的提升,和精神上的昇華。

       你可以選擇專精這項賽事,去收穫自己的夢想。也可以花些時間,多去擴充套件自己的視野。比如數學建模競賽,也是三人一組,需要團隊具備數學建模、程式設計、論文寫作的能力。說到寫作,就不得不講排版,office辦公軟體(是微軟2007版本以上的辦公軟體,不推薦wps,因為它不支援vba)一定要認真學,這是以後工作必備的能力。相關軟體的學習我推薦oeasy的視訊。另外數學,計算機專業最適合使用的排版軟體是tex不是word,有興趣的同學,特別是打算讀研究生的,可以在本科階段就學學LaTeX,這個學習資料推薦劉海洋的《LaTeX入門》。
       與程式設計相關的課程視訊,推薦“魚c工作室”。網易公開課上也有大量名校的免費課程視訊,資訊時代大家要學會好好利用資源。

       前文推薦的演算法和程式設計書籍,可以在我的百度網盤下載到電子版。注意檔案是pdf型別的,要用福昕閱讀器等軟體開啟。做技術與學術,pdf電子書是非常常見的。

       敲程式碼我不推薦VC6.0,可以用藍橋杯官方指定的DEV,比較不錯的還有CodeBolcks。

       (本段選讀)對C語言開發過程比較瞭解的同學,應該知道程式碼編輯和程式碼編譯是兩回事,可以分開進行的。程式碼編輯軟體我推薦vim、notepad++,有興趣的同學可以學學看。在編輯器配置上,會涉及環境變數等一些相關知識,有困難的同學可以找我諮詢。說到環境變數,有時也會涉及命令列,作為一個程式設計師多少是要懂點的,《入門經典》附錄也有簡要介紹。

       說這麼多,是想指明一條條路都應該怎麼走。而不是要你一下子全部學會,很多東西都將會陪伴你整個大學,甚至人生。學習的過程切記浮躁,要打好基礎,一步一個腳印。

      學無止境,有些人可能會沒有信心,我最後再跟大家分享一個《百喻經》裡的故事吧。
      有這樣一個人,在路上走得口乾舌燥,很想喝水。看到熱氣騰騰的霧氣以為是水,奔去一看,卻不是的。後來,終於來到一條河流旁,面對河水看著卻不喝。同行的人問他:“你渴得厲害想找水喝,現在水就在你面前,為什麼不喝?”這人回答:“你能喝得完這麼多的水嗎?要是能喝完,我早就去喝了。就是考慮到喝不完,所以我才不喝。”大家聽了這話都哈哈大笑。