剛剛絕定投身ACM-ICPC的同學先要過兩關。
第一關:程序設計語言
如果學校有開設相關課程,則省去了很多麻煩。如果沒有則可以選擇《程序設計導引及在線實踐》作為教材。現在的比賽中允許使用的語言相對局限,建議c和c++至少掌握一種。java可以在后面的做題過程中慢慢學習。
其實剛開始只需要掌握語言的基本語法就可以開始做題了。在做題過程中慢慢熟練語言的技巧。
第二關:英語
掌握了程序設計語言之后要開始做題了,發現題目都是英文的讀不懂,怎么辦?請同學們注意,不要才用上網搜中文翻譯或者用軟件進行全文翻譯的方法,這樣英文水平很難提高。要硬着頭皮堅持讀原版英文題,不會的單詞可以查詞典或者屏幕取詞。這樣英文閱讀能力會逐漸有所提升。很快就可以脫離詞典。
現在可以開始正式的訓練了。訓練初期,方法非常簡單,就是在OJ上找一些簡單題做,想獲取簡單題題號可以百度搜索“某oj簡單題”,個人推薦POJ(http://poj.org/)。
訓練的過程中要注意如下問題:
1. 寫解題報告
解題報告是為同學們的復習提供方便,就像課堂筆記一樣。如果不寫,有許多做過的題都會忘記,那做題對能力的提高就很小。因為目的是備忘,所以對於自己獨立完成的題目可以簡寫。對於通過參考網上答案來完成的題目要細寫。細寫的解題報告要包含三部分:問題描述、解決辦法、代碼。詳細程度要達到在自己完全忘記這道題的情況下通過解題報告能夠了解題意和解題過程。寫了解題報告還不算完,記得定期復習。
2. 寫算法描述
做題的時候可能會接觸到一些自己沒學過的算法。在學習之后,需要用自己容易理解表達方式對算法進行描述,詳細程度也是要讓自己在完全忘記該算法的情況下能通過它迅速了解算法的原理或流程。同樣記得定期復習。
3. 獨立思考
做題可能遇到三種情況: 第一,獨立思考就能完成,則略寫解題報告。第二,需要上網找答案,但是並沒有涉及到新算法,則詳寫解題報告。第三,需要上網找答案且涉及新算法,則詳寫解題報告,寫算法總結。這三種情況中的后兩種,即遇到不會做的題時,記得不要太急於上網找答案,先要充分地獨立思考。這也是無數大牛強調的,對能力的提升有極大的幫助。但獨立思考也要掌握分寸,思考時間過長會身心俱疲且浪費時間。
4. 查找答案
上述第三種情況可能直接看別人的解題報告並不能解決問題,因為解題報告通常只從算法的應用角度進行描述,並不描述算法本身。因此,要學習新算法還要上網搜索該算法的描述來進行學習,可以選擇百度百科或者文庫。
5. 寫代碼
寫代碼的過程中注意變量的命名,函數的抽象,如果時間不是十分緊迫的話,一定要保證程序結構清晰可讀性強。因為整潔的代碼可以大大提高DEBUG的效率。有些細節的處理可以參考網上別人的代碼,學習一些細節處理的小技巧。尤其是第一次學習某個算法的時候,一定要閱讀多種別人對該算法實現的代碼,選擇最適合自己作為以后自己的實現方法。
6. 整理模板
這個的難度要求就比較大,要求同學們做題后從自己的代碼中提取那些可復用的部分(別的題也可以用的代碼)保存成模板以后使用。先說明一下原因,現場賽可以帶紙質資料,總結的模板是可以在比賽中用到的,可提高打代嗎的速度和正確性。而別人總結的模板也可以用,但有時會出現用起來不順手或者功能不全等問題。因此,總結自己的模板是必要的。為了復用性可以對代碼做適當修改。注意添加注釋說明,詳細程度要達到在自己忘了這個模板的用法的情況下能通過說明了解其用法。
總體來說,初期的訓練方法就是在OJ做題,通過做題來學習算法和提高各方面能力。當然有機會的要多在實戰中鍛煉自己。個人不建議單獨看書學習算法,因為沒有足夠題目的強化,算法很容易忘記。
同學們如果有什么問題可以直接在下面提問,我會將普遍問題和答案添加到文章中。