在ACM比賽中老是只能過一題或者兩題,該怎樣提高自己?
12-29
題主是准大二,在高中參加過noip,也有一定成績(強省省二)。到了大學對於演算法競賽也有濃厚的興趣,但是總是得不到好的成績。每次在校內的聯繫賽或者其他比賽的時候,只能過一題或者兩題,看到那些將近AK的大神,崇拜之餘也覺得自己太渣。想要提高自己,望各位知友相助。
PS:本人平時也不是太懶,刷各種oj,刷題量也不少,但是會的就會,不會的還是不會,自己感覺沒什麼提高。望知友答疑。
首先,雖然刷題是好的,但是刷題絕對不能追求數量,一定要刷自己不會的題。會做的題重複一千遍,你還是只會做那些最簡單的題,頂多能更熟練,手速更快而已。但是在一場五個小時的比賽中,這種手速並沒有什麼意義。
具體來說,首先是要選擇你目前不會但是又力所能及的題,評判標準是比賽中你做不出來,但是通過人數又很多的題。難度除了可以通過比賽時通過人數標定以外,也可以看OJ上的數據,還可以通過隊友和老師的推薦。每道題盡量全憑自己做出來。比賽中,最終做出來的題一般最多花一個小時時間。那麼在練習時,應該花更多的時間去嘗試,至少2-3個小時,如果還是不能做出來,才可以去看題解。
UPD8.19
@一艘大帆船的建議很好。掌握理解好經典演算法會對解題很有幫助。我推測你的水平應該是學習了一些經典演算法,比如Dijkstra,Kruskal,一些經典的DP問題,可能還有網路流等等的內容,但是依然不能有效地運用到較為複雜的題目中去。為了加深理解,一方面的方法是做題,上面已經說過了。如果覺得某一類方法掌握的不好,可以多做一些相關的題,但是不要一味地這樣做,因為很多時候一道題如果已知了思考方向,難度會大大降低。另一方面的方法是反覆思考經典問題。有很多人,經典問題雖然會做,但是推廣能力相當於沒有。因為經典問題的解法本身,我們是可以通過類似背課文,這種死記硬背的方式背下來的,但是這並不意味著掌握了這個問題。所以還需要多思考,直到覺得這種演算法是非常自然的,而不覺得是什麼奇技淫巧。對經典問題的理解深度和解題數量也是相關的,要交替來做。如果不是編程經驗欠缺的問題。(鑒於樓主刷過很多題已經有了自己良好的代碼風格)那就是數學,數學很重要,尤其是離散數學,建議樓主看看此方面書籍,這是演算法原理的基礎,做題的時候分析證明自己演算法的正確性,時間空間複雜性現,及寫好偽代碼。做題的時候考慮情況要全面。如果樓主懶得這樣做。。。。 那就多刷題,多看題解做做錯題總結什麼的,寫寫題解報告什麼的邊刷邊看相關經典書籍。 最後水題有害生命健康,遠離水題-_-||。 還有堅持很總要,我一學長高中noip沒得省一(發揮失常當時灰常傷心T_T,他刷通了usaco,還刷了其他很多題,還買了MIT的演算法導論學),但是大學繼續努力,最後去了斯坦福,最近還曬Google的員工來講課。真是羨慕死我等渣渣
謝邀!
刷各種oj,刷題量也不少。。。請問有沒有作總結歸納?或者寫解題報告?畢竟競賽的時候,出原題的可能性很少,如果出現原題,基本就是被罵的後果。所以如果不能把做過的題抽象成一類題,相當於白做。至少也能舉一反三啊~!
欽爺已經說到重點了。他就是能AK的大神,不是將近。。重要的事重複三遍,我負責第二遍,不能只看數量,不然hdoj第11頁可以給你帶來一天100題的快感,然並卵。所以說質量很重要。根據我的經驗,不看題解,不看代碼,不去看/借/求測試數據,僅靠自己的本地編譯器+雙手+大腦思考一天左右能想出來的題(一道題憋一周就有點浪費時間了),對自己的提高是最有性價比的。這類題可以從過去的(大概四年以前)的套題中拎出來。每天一道題,一年堅持不懈就能讓自己達到一個很高的台階了。為什麼我說四年前呢,因為根據我的經驗(還是經驗),最近三年的套題,對團隊的合作水平默契分工的提高比較有幫助。不要浪費好題!記住,ACM和OI不同的就是,題目沒那麼直接,題目不是中文,比賽不是一個人的事,尤其第三點。這是ACM的優勢,必須學會利用,1+1+1&>3。既然你已經有很好的基礎,而且成績又不錯,那麼一定要找到適合自己的隊友,默契是必須有的(或許自己養tiao成jiao一個?),最起碼能聽懂自己對演算法,題意的複述,看得懂代碼,能夠在自己的代碼上進行調試,而不是推倒重寫,然後對拍(雖然這也是一種查錯方法,但是是效率最低的方法)。顯然要多刷題,題刷多了,感覺就來了,看什麼都tm是原題或水題
我也是只能過一兩道,然後就被踢出隊伍了……
推薦閱讀:
※你在做演算法題時遇到過哪些蜜汁錯誤?
※搞ACM/ICPC競賽跟做Research哪個更重要?
※2017 年的 ACM ICPC World Finals 會有哪些看點?
※如何評價2017年ACM/ICPC南寧站現場賽?
※如何向親戚朋友解釋自己是搞演算法的?