ACM訓練計劃建議c++
From:freecode# Date:2015/5/20算法
老師要咱們整理一份訓練計劃給下一屆的學弟學妹們,整理出來了,費了很多筆墨,就也將它放到博客園上供你們參考。數組
菜鳥之做,大牛勿噴,若有不當或補充之處,歡迎指出。網絡
本建議書分爲三個階段,大1、大2、大三。大四暫沒整理,一方面是大四要面臨考驗和找工做的問題,堅持繼續acm的不多,另外一方面,本人還沒大四……數據結構
下面以我的經驗分析一下這三個階段建議學習的內容和具體的訓練計劃。函數
大一是時間最充裕的一段時間,也是可塑性最高的一個階段。大一你有不少自由時間能夠本身分配,建議這段時間先打好c/c++基礎,或者是任何一門語言的基礎,儘可能作到「半精通」。由於像c++這種語言,幾年內達到精通都是不可能的。而我這裏所說的「半精通」,其實是將課本徹底搞透的基礎上,再在課外拓展一些內容,加深對語言自己的理解。學習
爲何我這裏強調語言的重要性呢?一方面是爲了之後搞acm的須要,語言通暢了,能夠保證你實現大部分算法沒有障礙,而比賽時,時間是很重要的。另外一方面,也是你身爲學計算機的學生的一個必需要學習的能力,語言就是你手中的劍,之後能披荊斬棘走多遠,劍有多鋒利佔很大因素。測試
另外一方面,建議打好數學的基礎。學長身爲過來人,深受數學爛的苦。acm越到後期的時候,其實用到的數學知識就越多。像有些題目,赤裸裸的就是求積分,還有一些題目,將求指望嵌入到了DP的題目裏…… 其實這些還好說,都是顯式的題目,還有一種隱式的東西,對acm幫助最大,那就是數學思惟。有數學思惟和沒有數學思惟的區別,就是一道題有N種思路和N*N種思路的區別。這越到後期越明顯,思路很重要,比賽時面對一道題團隊裏首先要有多種思路可供分析,而後你們討論哪一種思路是最可行的,肯定以後就是最擅長這個思路的人實現算法。若是分析一道題目的時候,產生的思路不多,那麼無疑會下降這道題的AC命中率。網站
囉嗦了這麼多,其實我就想給大一的新生們強調兩點,語言和數學。.net
具體的實現策略,數學的話,好好上課,把課本搞明白。
語言的話,建議:課本+刷題 | 不會的問老師。
這個階段刷題的話,除了我們學校的oj,還能夠到各大oj刷題,poj上的水題比較多,並且質量較高,這裏貼出一個poj水題的列表(轉)。
poj1000:A+B problem
poj1002:電話上按鍵對應着數字。如今給n個電話,求排序。相同的歸一類
poj1003:求最小的n讓1+1/2+1/3+...+1/n大於給的一個實數
poj1004:求一堆實數的平均數
poj1005:由座標 (0,0) 開始,以半圓爲形狀每一年侵蝕50m^2,問(0,0)開始到(x,y)結束須要多長時間
poj1006:三個週期是常數。如今給三個週期出現高峯的時候,問下一次出現高峯是何時
poj1007:求字符串排序
poj1008:一種日曆,計算日期數量
poj1012:Joseph問題
poj1013:給3次稱硬幣的結果問哪一個是假幣且假幣比真幣輕仍是重
poj1016:一個數串這樣變化:它的後繼是:它含有幾個1,含有幾個2...問循環狀況
poj1017:1×1,2×2,3×3,4×4,5×5,6×6的產品放到6×6×h的盒子裏。求h最小值。
poj1028:模擬網頁瀏覽
poj1031:求一個點是否在凸包裏面
poj1032:把n分紅若干個不一樣的數的和,求最大乘積
【2+3+...若是多出來就從最大一個數開始加1】
poj1045:數學公式
poj1046:給16個底色,後給若干個顏色問與前面哪一個距離最小?
poj1051:一個字符串,每一個字母都有一個代替。如今把那個代替又代了一些回去,求原串。
poj1056:給若干個字符串,問是否有一個是另一個的前綴?
【其實能夠用trie來作,不過暴力可過】
poj1061:給出兩隻青蛙的座標(一條經線上),每一個青蛙條一次的距離,問跳多少次能夠碰到?
poj1065:處理n個木棍,每一個木棍有兩個參數。若是一個前面一個處理的不比它大就能夠不用轉換時間,不然須要1個時間。問最少轉換時間?
poj1083:一共400個房間,南邊200個北邊200個。從一個房間搬東西到另一個房間須要10min,此期間其餘人就不能經過這段路,一個房間最多一次搬入或者搬出。
【統計每段路經過幾回求max】
poj1118:給若干個點求含最多點的直線含點數
poj1146:求一個字符串後面一個字典序
【next_permutation函數】
poj1183:arctan(1/a)=arctan(1/b)+arctan(1/c),給出a,求b+c最小的解
【數學推導】
poj1207:每一個數進行以下操做:若是是偶數/2,若是是奇數*3+1。問一個區間內能夠操做操做次數最多的那個數的操做次數
【直接作就能夠過】
poj1218:求1-n之間有多少個平方數
poj1256:求一個字符串的全排列
【next_permutation函數】
poj1298:字母替換問題
poj1517:求i=0-9 e=∑0<=i<=n1/i!的數值
poj1657:給棋盤上的起始點和終止點,求王、後、車、象的最短距離
poj1833:求後面一個字典序
【next_permutation函數】
poj1835:模擬一個宇航員運動。(三維,左轉右轉上轉下轉前轉後轉)
poj1936:給兩個s和t兩個字符串。問t刪去一些字符後是否可與s相同
poj2027:比較兩個數的大小
poj2159:倆密碼。問前面一個可不多是後一個的原碼。
【相同字母數相同】
poj2262:對1000000內的偶數進行哥德巴赫猜測
poj2606:給若干個點求含最多點的直線含點數
poj2656:有n天,若是一天的上課時間+課外時間>8就不開心。求最先一天不開心的時間。
poj2663:2×1的多米諾牌來覆蓋3×n的長方形問方案數
poj2739:求一個數能夠表示成多少種連續素數的和。
poj2780:給若干個點求含最多點的直線含點數
poj3006:給一個數列(首相公差),求這個數列中第n個素數
poj3087:不停洗牌,問多少次後能夠達到目標狀態?
poj3094:把輸入的再輸出
poj3175:給一個字符串,求那個整數的開方的小數部分前n個有效數位即該字符串?
poj3299:有三個變量和推導公式,任給兩個求第三個。
poj3589:猜數遊戲判斷兩個數有多少A和B
poj3618:每次一我的到離原點最近的一個景點(有正負)求最多能通過多少個景點?
poj3619:每一個人讀書有速度,讀了必定時間會停下來。求每一個人讀完多少頁須要多少時間
poj3620:求最大的一個連通塊
poj3627:求最少的人讓他們的高度超過一個數字
poj3663:給n個數字。問有多少對數字和<=s
poj3664:兩輪投票,第一輪前m位進入第二輪;第二輪最高票爲冠軍
poj3665:每次取最大的一個數,而後把它評分給剩下n-1個數,不能平分就從1號數開始加。求取數順序
poj3671:n個1和2,問至少修改多少個數可讓整個序列有序?(1在前2在後)
poj3672:上坡須要時間下坡須要時間平坡須要時間。如今給你去的路線求回去路線的須要時間
poj3673:另類乘法,兩個數各個位上的數乘積的和
poj3749:解密一個字符串。每一個字符串都是原先字母后推5個字母
大二是一個很重要的時期,必定要把握好,特別是把握好學習的方向,有目的的學習,不要像學長同樣,跌跌撞撞學學這學學那,荒廢了不少時間。
因此在學期開始的時候,要先給本身定一個學習計劃。大二有兩個學期,分析好本身的優缺點,擅長的和不擅長的,感興趣的方向,而後綜合起來明確本身這一年應該作哪些事情,應該達到什麼程度。
這裏給出我的建議,第一學期,數據結構,第二學期,選幾個方向專攻一下。
第一學期中建議的數據結構不只是acm中不少方向的基礎,也是學習計算機的一個重要基礎,因此建議同窗們打好數據結構的基礎。時間上,我只是給一個參考,你能夠根據本身的興趣和課程來安排本身的時間。你能夠在趁假期專攻一下,也能夠等着老師上課時學習。
關於第二學期建議的方向專攻,這裏要重點說明一下,acm涉及的領域很廣,咱們的時間又是有限的,你不可能把全部方向都精通,而acm又是團隊配合的比賽,因此你能夠和隊友每一個人負責專攻幾個方向,這樣比賽時不會出現一道題誰都沒思路的狀況。另外建議每一個人專攻的方向要有必定的交集,否則比賽時,沒有人和你討論,會下降這道題的正確率。事實上,到了後期,咱們隊(僅僅是咱們隊)沒有依賴這種模式,而是改爲了兩我的討論思路+一我的敲代碼,這是根據各隊的特色安排的。固然我認爲分方向仍是有必要的,由於這合理分配了團隊中每一個人的精力,並在短期內保證了團隊的知識面沒有漏洞。畢竟一口是吃不成胖子的。
下面給出咱們劃分的幾大方向,給你們作個參考(排名不分前後)。
一、數論
二、圖論
三、動態規劃
四、計算幾何
五、搜索
六、博弈
七、組合數學
八、數據結構
九、模擬
我的對這九個方向的印象和推薦題目(部分轉載):
各方向題集能夠參見連接:http://blog.csdn.net/liuqiyao_01/article/details/9079611
1、數論
大概有素數測試(篩法),擴展歐幾里得算法,同餘模運算,高斯消元,中國剩餘定理,莫比烏斯反演等等。
我不擅長這方面(數學爛,還好後期團隊裏有兩位數學大神),不發表評論。
推薦題目:
同餘模運算:poj2635, poj3292,poj1845,poj2115
素數測試與篩法:poj2191,poj1811
高斯消元:poj1681,poj1222
擴展歐幾里得算法:poj2891,poj1061
中國剩餘定理:poj1006,zoj3538
莫比烏斯反演:poj2154
2、圖論
最短路,最小生成樹,拓撲排序,二分圖,最大團,最大流,強連通份量,最近公共祖先,次小生成樹,歐拉回路,哈密頓迴路等等。
圖論理論深,實現又麻煩,很差啃。
推薦題目:
最小費用最大流(poj2516,poj2516,poj2195)
雙連通份量(poj2942)
強連通分支及其縮點.(poj2186)
圖的割邊和割點(poj3352)
最小割模型、網絡流規約(poj3308, )
3、動態規劃
揹包問題,樹形DP,數位DP等等。
動態規劃給個人感受是比賽時一道題裏面涉及了DP基本上就是難題了……
不開玩笑,動態規劃很難,須要時間的積累(多作題),須要鍛鍊的是用動歸解題的思想,這急不來。
推薦題目:
揹包問題:hdu260二、poj362四、hdu254六、hdu295五、poj218四、hdu2639
樹形DP:poj115五、hdu10十一、poj194七、hdu156一、hdu400三、poj2486
機率DP:zoj338三、zoj3460、hdu440五、hdu4336
數位DP:hdu208九、hdu355五、hdu365二、poj3252
4、計算幾何
點積和叉積、線段相交、多邊形面積、凸包、半平面、圓與點的切線、圓與直線的交、圓與圓的交、圓與多邊形的並和交、三維凸包、三維點和直線等等。
計算幾何內容繁雜,實現麻煩,精度問題更是讓人糾結(本人負責的方向,學習的時候各類淚啊,兩次省賽還都沒考到……哭)。
推薦題目:
點積和叉積:poj231八、poj2398
線段相交:poj330四、poj126九、poj265三、poj106六、poj1039
凸包:poj111三、poj334八、poj131八、poj169六、hdu139二、poj218七、hdu1348
半平面交:poj333五、poj3130、poj147四、poj1278
曼哈頓距離:hdu466六、poj2926
5、搜索
dfs、bfs、A*、IDA*、雙向廣搜等等。
前期搜索相對容易入門,後期那些搜索的難題真是難啊。
這幾年省賽好像沒有單獨的搜索題了。
推薦題目:
dfs:poj172四、hrbustoj117九、hdu172八、hdu104五、hdu13十二、sdut215二、hdu142六、poj238六、hdu255三、hdu102二、hdu124一、hdu101六、hdu10十、hdu1175
bfs:poj398四、poj327八、hdu124二、hdu1240、hdu119五、hdu271七、hdu125三、hdu102六、hdu1180、hdu2612
6、博弈
巴什博弈、威佐夫博奕、Fibonacci博弈、尼姆博弈、公平組合博弈等等。
博弈不熟,好像是找必勝態,固然也能夠找規律……
博弈代碼通常都很短,只要分析出來公式(或規律),不難實現。
推薦題目:
poj106七、poj1740、poj223四、poj108二、poj234八、poj241三、poj2419
7、組合數學
容斥原理、抽屜原理、置換羣與Polya定理、母函數等等。
記得第五屆省賽出了好多組合數學的題……
推薦題目:
置換羣:poj236九、poj102六、poj172一、poj3270、poj1879
Polya定理:hdu18十二、hdu181七、hdu248一、hdu1286
容斥原理:hdu220四、hdu320八、hdu179六、hdu284一、hdu1695
8、數據結構
串處理、棧和隊列、樹、哈希、二分查找、並查集、線段樹、二維線段樹、哈夫曼樹、後綴數組等等。
數據結構內容比較雜,涉及的又都是基礎的知識,其中的不少思想均可以用在其餘題目上,必定要學好。
這裏把它做爲一個方向,是爲了它到了後期的一些高級的數據結構,例如字典樹、劃分樹、線段樹、AC自動機等等。
推薦題目:
查找(二分、哈希):poj334九、poj100二、hdu214一、hdu1025
串(AC自動機、KMP):hdu369五、hdu220三、sdut24十一、poj240六、hdu135八、hdu3336
並查集:poj223六、poj252四、poj118二、poj16十一、hdu1232
字典樹:poj250三、poj200一、hdu124七、hdu107五、hdu1251
樹狀數組:hdu155六、poj119五、poj332一、hdu1541/poj2352
線段樹:poj215五、poj119五、poj346八、poj326四、hdu155六、hdu169八、hdu175四、hdu1166
劃分樹:poj210四、sdut2610
9、模擬
模擬就不舉例了,這裏只做爲一種題型出現,沒有什麼固定的題目類型。
模擬主要實現麻煩,思路每每不難。只要耐心點,注意細節,多斟酌斟酌,就沒問題。
推薦題目:
hdu1030、hdu103三、hdu103五、hdu105七、hdu106三、hdu100二、hdu100四、hdu101三、hdu101五、hdu101七、hdu1020、hdu102二、hdu102九、hdu103一、hdu103三、hdu103四、hdu103五、hdu103六、hdu103七、hdu103九、hdu104二、hdu104七、hdu104八、hdu104九、hdu1050、hdu105七、hdu1062
最後加個10。
10、STL
STL,Standard Template Library,標準模板庫。
須要瞭解一下,基本的set、map、vector、queue、algorithm要會用。
不少題目都須要用stl解決,甚至是赤裸裸的考察stl。
Stl的好處在於方便,並且因爲它是動態開闢內存,能夠解決一些空間開闢不出來的問題。
例如hash空間太大,一會兒開闢不出來,可使用set解決。
大三要作的事,只有兩個字:強化。
不要小看這個時期,這但是能創造奇蹟的一個重要的昇華期。在通過前兩個階段的基礎學習和方向延伸後,你的算法底子已經有了,而且有了必定的見識,瞭解幾個方向的算法知識。這個時候,你能夠沉下心鞏固學過的知識,以及慢慢學習其它領域的知識。這個過程很慢,很艱難,能讓你感到成就感的回饋也少,因此你會感到累,感到辛苦,甚至懷疑本身學得東西是否是沒用的,並且這個時期受到的外界誘惑比較多,考研,作項目……這些都會讓你分心,可是我想說,必定不要放棄,這是你的瓶頸期,也是你的acm之路的一個考驗,度過去了,你可能就會收穫不可思議的回報。
這裏強化的方式有兩個:一是剛纔說的看書作題學習新知識,二是打比賽。
如今已經後期,你要常常學會常常打比賽,本身打,跟隊友一塊兒打,一方面能夠鍛鍊團隊配合,另外一方面也能夠很好的發現本身的漏洞。同時打比賽也是保持狀態的一個良好途徑,懶惰?沒精神?沒狀態?拉到賽場上緊張地作幾個小時題就清醒了。記得咱們五一訓練的時候,一天一場訓練賽,早上睡眼惺忪的到實驗室,還沒伸個懶腰就轟轟烈烈的投入到作題的行列中,讀題、分析、討論、敲代碼,愈來愈清醒,等到比賽結束以後,才恍然發現,已經到下午了……
打比賽也有好多途徑,你能夠本身找,也能夠聽個人推薦,下面舉例:
1、按期比賽網站
Bestcoder:咱們常打的比賽,題目質量待考究,不過用來每週練練手仍是不錯的。
Codeforces:題目質量較高,你的得分rating也是將來找工做的一個可信度很高的衡量標準。
Topcoder:沒打過,據說很難。
2、不按期比賽
你能夠關注杭電或者其餘一些oj的Recent Contests,能夠查看其餘oj最近舉行的一些比賽。
3、Virtual Judge
Virtual Judge能夠抓取各大oj的題目製做成比賽,若是近期沒有比賽了,你又感到寂寞難耐,你能夠用它本身給本身出題。
Virtual Judge網址:http://acm.hust.edu.cn/vjudge/toIndex.action
註冊個帳號就能DIY比賽了。
另外給出一些推薦書目,你們能夠在訓練或者學習的過程當中參考這些書:
劉汝佳系列:
《算法競賽入門經典》劉汝佳(小白)
這本書不厚,題目很靈活,拿來入門很好。
《算法競賽入門經典(第2版)》劉汝佳(紫皮書)
小白的第二版,沒看這本書,不知道多了什麼內容,只是變厚了好多……
《算法競賽入門經典——訓練指南》劉汝佳(大白)
大白看了一部分,語言通俗易懂,計算幾何就是靠它入門的。
《算法藝術與信息學競賽》劉汝佳(黑皮書)
很難,大三以前不推薦看。
劉汝佳的書習題不少在UVA上,國內訪問很慢,好像還被牆了,能夠FQ過去刷題……
《離散數學》
《組合數學》
《數據結構》
參考書
《挑戰程序設計競賽》
聽說這本書不錯,拿來推薦一下。
《算法導論》
這本書放在這是用來膜拜的……
把習題刷完你就是大神了。
注意三個階段都很是重要,請不要荒廢任何一個時期,俗話說「何時作什麼事」,這個階段作事情A,下個階段還有事情B要作,因此請珍惜時間,不要三心二意,不要輕言放棄。