ACM训练计划建议(转)
ACM訓(xùn)練計劃建議
From:freecode# ?Date:2015/5/20
前言:
老師要我們整理一份訓(xùn)練計劃給下一屆的學(xué)弟學(xué)妹們,整理出來了,費(fèi)了不少筆墨,就也將它放到博客園上供大家參考。
菜鳥之作,大牛勿噴,如有不當(dāng)或補(bǔ)充之處,歡迎指出。
本建議書分為三個階段,大一、大二、大三。大四暫沒整理,一方面是大四要面臨考驗和找工作的問題,堅持繼續(xù)acm的很少,另一方面,本人還沒大四……
下面以個人經(jīng)驗分析一下這三個階段建議學(xué)習(xí)的內(nèi)容和具體的訓(xùn)練計劃。
?
正文:
大一(第一階段):
大一是時間最充裕的一段時間,也是可塑性最高的一個階段。大一你有很多自由時間可以自己分配,建議這段時間先打好c/c++基礎(chǔ),或者是任何一門語言的基礎(chǔ),盡量做到“半精通”。因為像c++這種語言,幾年內(nèi)達(dá)到精通都是不可能的。而我這里所說的“半精通”,實際上是將課本完全搞透的基礎(chǔ)上,再在課外拓展一些內(nèi)容,加深對語言本身的理解。
為什么我這里強(qiáng)調(diào)語言的重要性呢?一方面是為了以后搞acm的需要,語言通暢了,可以保證你實現(xiàn)大部分算法沒有障礙,而比賽時,時間是很重要的。另一方面,也是你身為學(xué)計算機(jī)的學(xué)生的一個必須要學(xué)習(xí)的能力,語言就是你手中的劍,以后能披荊斬棘走多遠(yuǎn),劍有多鋒利占很大因素。
另一方面,建議打好數(shù)學(xué)的基礎(chǔ)。學(xué)長身為過來人,深受數(shù)學(xué)爛的苦。acm越到后期的時候,其實用到的數(shù)學(xué)知識就越多。像有些題目,赤裸裸的就是求積分,還有一些題目,將求期望嵌入到了DP的題目里…… 其實這些還好說,都是顯式的題目,還有一種隱式的東西,對acm幫助最大,那就是數(shù)學(xué)思維。有數(shù)學(xué)思維和沒有數(shù)學(xué)思維的區(qū)別,就是一道題有N種思路和N*N種思路的區(qū)別。這越到后期越明顯,思路很重要,比賽時面對一道題團(tuán)隊里首先要有多種思路可供分析,然后大家討論哪種思路是最可行的,確定之后就是最擅長這個思路的人實現(xiàn)算法。如果分析一道題目的時候,產(chǎn)生的思路很少,那么無疑會降低這道題的AC命中率。
啰嗦了這么多,其實我就想給大一的新生們強(qiáng)調(diào)兩點,語言和數(shù)學(xué)。
具體的實現(xiàn)策略,數(shù)學(xué)的話,好好上課,把課本搞明白。
語言的話,建議:課本+刷題 | 不會的問老師。
這個階段刷題的話,除了咱們學(xué)校的oj,還可以到各大oj刷題,poj上的水題比較多,而且質(zhì)量較高,這里貼出一個poj水題的列表(轉(zhuǎn))。
?
poj1000:A+B problem
poj1002:電話上按鍵對應(yīng)著數(shù)字?,F(xiàn)在給n個電話,求排序。相同的歸一類
poj1003:求最小的n讓1+1/2+1/3+...+1/n大于給的一個實數(shù)
poj1004:求一堆實數(shù)的平均數(shù)
poj1005:由坐標(biāo) (0,0) 開始,以半圓為形狀每年侵蝕50m^2,問(0,0)開始到(x,y)結(jié)束需要多長時間
poj1006:三個周期是常數(shù)。現(xiàn)在給三個周期出現(xiàn)高峰的時候,問下一次出現(xiàn)高峰是什么時候
poj1007:求字符串排序
poj1008:一種日歷,計算日期數(shù)量
poj1012:Joseph問題
poj1013:給3次稱硬幣的結(jié)果問哪個是假幣且假幣比真幣輕還是重
poj1016:一個數(shù)串這樣變化:它的后繼是:它含有幾個1,含有幾個2...問循環(huán)情況
poj1017:1×1,2×2,3×3,4×4,5×5,6×6的產(chǎn)品放到6×6×h的盒子里。求h最小值。
poj1028:模擬網(wǎng)頁瀏覽
poj1031:求一個點是否在凸包里面
poj1032:把n分成若干個不同的數(shù)的和,求最大乘積
【2+3+...如果多出來就從最大一個數(shù)開始加1】
poj1045:數(shù)學(xué)公式
poj1046:給16個底色,后給若干個顏色問與前面哪個距離最小?
poj1051:一個字符串,每個字母都有一個代替?,F(xiàn)在把那個代替又代了一些回去,求原串。
poj1056:給若干個字符串,問是否有一個是另外一個的前綴?
【其實可以用trie來做,不過暴力可過】
poj1061:給出兩只青蛙的坐標(biāo)(一條經(jīng)線上),每個青蛙條一次的距離,問跳多少次可以碰到?
poj1065:處理n個木棍,每個木棍有兩個參數(shù)。如果一個前面一個處理的不比它大就可以不用轉(zhuǎn)換時間,否則需要1個時間。問最少轉(zhuǎn)換時間?
poj1083:一共400個房間,南邊200個北邊200個。從一個房間搬東西到另外一個房間需要10min,此期間其他人就不能通過這段路,一個房間最多一次搬入或者搬出。
【統(tǒng)計每段路通過幾次求max】
poj1118:給若干個點求含最多點的直線含點數(shù)
poj1146:求一個字符串后面一個字典序
【next_permutation函數(shù)】
poj1183:arctan(1/a)=arctan(1/b)+arctan(1/c),給出a,求b+c最小的解
【數(shù)學(xué)推導(dǎo)】
poj1207:每個數(shù)進(jìn)行如下操作:如果是偶數(shù)/2,如果是奇數(shù)*3+1。問一個區(qū)間內(nèi)可以操作操作次數(shù)最多的那個數(shù)的操作次數(shù)
【直接做就可以過】
poj1218:求1-n之間有多少個平方數(shù)
poj1256:求一個字符串的全排列
【next_permutation函數(shù)】
poj1298:字母替換問題
poj1517:求i=0-9 e=∑0<=i<=n1/i!的數(shù)值
poj1657:給棋盤上的起始點和終止點,求王、后、車、象的最短距離
poj1833:求后面一個字典序
【next_permutation函數(shù)】
poj1835:模擬一個宇航員運(yùn)動。(三維,左轉(zhuǎn)右轉(zhuǎn)上轉(zhuǎn)下轉(zhuǎn)前轉(zhuǎn)后轉(zhuǎn))
poj1936:給兩個s和t兩個字符串。問t刪去一些字符后是否可與s相同
poj2027:比較兩個數(shù)的大小
poj2159:倆密碼。問前面一個可不可能是后一個的原碼。
【相同字母數(shù)相同】
poj2262:對1000000內(nèi)的偶數(shù)進(jìn)行哥德巴赫猜想
poj2606:給若干個點求含最多點的直線含點數(shù)
poj2656:有n天,如果一天的上課時間+課外時間>8就不開心。求最早一天不開心的時間。
poj2663:2×1的多米諾牌來覆蓋3×n的長方形問方案數(shù)
poj2739:求一個數(shù)可以表示成多少種連續(xù)素數(shù)的和。
poj2780:給若干個點求含最多點的直線含點數(shù)
poj3006:給一個數(shù)列(首相公差),求這個數(shù)列中第n個素數(shù)
poj3087:不停洗牌,問多少次后可以達(dá)到目標(biāo)狀態(tài)?
poj3094:把輸入的再輸出
poj3175:給一個字符串,求那個整數(shù)的開方的小數(shù)部分前n個有效數(shù)位即該字符串?
poj3299:有三個變量和推導(dǎo)公式,任給兩個求第三個。
poj3589:猜數(shù)游戲判斷兩個數(shù)有多少A和B
poj3618:每次一個人到離原點最近的一個景點(有正負(fù))求最多能經(jīng)過多少個景點?
poj3619:每個人讀書有速度,讀了一定時間會停下來。求每個人讀完多少頁需要多少時間
poj3620:求最大的一個連通塊
poj3627:求最少的人讓他們的高度超過一個數(shù)字
poj3663:給n個數(shù)字。問有多少對數(shù)字和<=s
poj3664:兩輪投票,第一輪前m位進(jìn)入第二輪;第二輪最高票為冠軍
poj3665:每次取最大的一個數(shù),然后把它評分給剩下n-1個數(shù),不能平分就從1號數(shù)開始加。求取數(shù)順序
poj3671:n個1和2,問至少修改多少個數(shù)可以讓整個序列有序?(1在前2在后)
poj3672:上坡需要時間下坡需要時間平坡需要時間?,F(xiàn)在給你去的路線求回去路線的需要時間
poj3673:另類乘法,兩個數(shù)各個位上的數(shù)乘積的和
poj3749:解密一個字符串。每個字符串都是原先字母后推5個字母
?
?
大二(第二階段):
大二是一個很重要的時期,一定要把握好,特別是把握好學(xué)習(xí)的方向,有目的的學(xué)習(xí),不要像學(xué)長一樣,跌跌撞撞學(xué)學(xué)這學(xué)學(xué)那,荒廢了很多時間。
所以在學(xué)期開始的時候,要先給自己定一個學(xué)習(xí)計劃。大二有兩個學(xué)期,分析好自己的優(yōu)缺點,擅長的和不擅長的,感興趣的方向,然后綜合起來明確自己這一年應(yīng)該做哪些事情,應(yīng)該達(dá)到什么程度。
這里給出個人建議,第一學(xué)期,數(shù)據(jù)結(jié)構(gòu),第二學(xué)期,選幾個方向?qū)9ヒ幌?/strong>。
第一學(xué)期中建議的數(shù)據(jù)結(jié)構(gòu)不僅是acm中很多方向的基礎(chǔ),也是學(xué)習(xí)計算機(jī)的一個重要基礎(chǔ),所以建議同學(xué)們打好數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。時間上,我只是給一個參考,你可以根據(jù)自己的興趣和課程來安排自己的時間。你可以在趁假期專攻一下,也可以等著老師上課時學(xué)習(xí)。
關(guān)于第二學(xué)期建議的方向?qū)9?#xff0c;這里要重點說明一下,acm涉及的領(lǐng)域很廣,我們的時間又是有限的,你不可能把所有方向都精通,而acm又是團(tuán)隊配合的比賽,所以你可以和隊友每個人負(fù)責(zé)專攻幾個方向,這樣比賽時不會出現(xiàn)一道題誰都沒思路的情況。另外建議每個人專攻的方向要有一定的交集,不然比賽時,沒有人和你討論,會降低這道題的正確率。事實上,到了后期,我們隊(僅僅是我們隊)沒有依賴這種模式,而是改成了兩個人討論思路+一個人敲代碼,這是根據(jù)各隊的特點安排的。當(dāng)然我認(rèn)為分方向還是有必要的,因為這合理分配了團(tuán)隊中每個人的精力,并在短時間內(nèi)保證了團(tuán)隊的知識面沒有漏洞。畢竟一口是吃不成胖子的。
?
下面給出我們劃分的幾大方向,給大家做個參考(排名不分先后)。
1、數(shù)論
2、圖論
3、動態(tài)規(guī)劃
4、計算幾何
5、搜索
6、博弈
7、組合數(shù)學(xué)
8、數(shù)據(jù)結(jié)構(gòu)
9、模擬
?
個人對這九個方向的印象和推薦題目(部分轉(zhuǎn)載):
各方向題集可以參見鏈接:http://blog.csdn.net/liuqiyao_01/article/details/9079611
1、數(shù)論
大概有素數(shù)測試(篩法),擴(kuò)展歐幾里得算法,同余模運(yùn)算,高斯消元,中國剩余定理,莫比烏斯反演等等。
我不擅長這方面(數(shù)學(xué)爛,還好后期團(tuán)隊里有兩位數(shù)學(xué)大神),不發(fā)表評論。
推薦題目:
同余模運(yùn)算:poj2635, poj3292,poj1845,poj2115
素數(shù)測試與篩法:poj2191,poj1811
高斯消元:poj1681,poj1222
擴(kuò)展歐幾里得算法:poj2891,poj1061
中國剩余定理:poj1006,zoj3538
莫比烏斯反演:poj2154
2、圖論
最短路,最小生成樹,拓?fù)渑判?#xff0c;二分圖,最大團(tuán),最大流,強(qiáng)連通分量,最近公共祖先,次小生成樹,歐拉回路,哈密頓回路等等。
圖論理論深,實現(xiàn)又麻煩,不好啃。
推薦題目:
最小費(fèi)用最大流(poj2516,poj2516,poj2195)
雙連通分量(poj2942)
強(qiáng)連通分支及其縮點.(poj2186)
圖的割邊和割點(poj3352)
最小割模型、網(wǎng)絡(luò)流規(guī)約(poj3308, )
3、動態(tài)規(guī)劃
背包問題,樹形DP,數(shù)位DP等等。
動態(tài)規(guī)劃給我的感覺是比賽時一道題里面涉及了DP基本上就是難題了……
不開玩笑,動態(tài)規(guī)劃很難,需要時間的積累(多做題),需要鍛煉的是用動歸解題的思想,這急不來。
推薦題目:
背包問題:hdu2602、poj3624、hdu2546、hdu2955、poj2184、hdu2639
樹形DP:poj1155、hdu1011、poj1947、hdu1561、hdu4003、poj2486
概率DP:zoj3383、zoj3460、hdu4405、hdu4336
數(shù)位DP:hdu2089、hdu3555、hdu3652、poj3252
4、計算幾何
點積和叉積、線段相交、多邊形面積、凸包、半平面、圓與點的切線、圓與直線的交、圓與圓的交、圓與多邊形的并和交、三維凸包、三維點和直線等等。
計算幾何內(nèi)容繁雜,實現(xiàn)麻煩,精度問題更是讓人糾結(jié)(本人負(fù)責(zé)的方向,學(xué)習(xí)的時候各種淚啊,兩次省賽還都沒考到……哭)。
推薦題目:
點積和叉積:poj2318、poj2398
線段相交:poj3304、poj1269、poj2653、poj1066、poj1039
凸包:poj1113、poj3348、poj1318、poj1696、hdu1392、poj2187、hdu1348
半平面交:poj3335、poj3130、poj1474、poj1278
曼哈頓距離:hdu4666、poj2926
5、搜索
dfs、bfs、A*、IDA*、雙向廣搜等等。
前期搜索相對容易入門,后期那些搜索的難題真是難啊。
這幾年省賽好像沒有單獨的搜索題了。
推薦題目:
dfs:poj1724、hrbustoj1179、hdu1728、hdu1045、hdu1312、sdut2152、hdu1426、poj2386、hdu2553、hdu1022、hdu1241、hdu1016、hdu1010、hdu1175
bfs:poj3984、poj3278、hdu1242、hdu1240、hdu1195、hdu2717、hdu1253、hdu1026、hdu1180、hdu2612
6、博弈
巴什博弈、威佐夫博奕、Fibonacci博弈、尼姆博弈、公平組合博弈等等。
博弈不熟,好像是找必勝態(tài),當(dāng)然也可以找規(guī)律……
博弈代碼一般都很短,只要分析出來公式(或規(guī)律),不難實現(xiàn)。
推薦題目:
poj1067、poj1740、poj2234、poj1082、poj2348、poj2413、poj2419
7、組合數(shù)學(xué)
容斥原理、抽屜原理、置換群與Polya定理、母函數(shù)等等。
記得第五屆省賽出了好多組合數(shù)學(xué)的題……
推薦題目:
置換群:poj2369、poj1026、poj1721、poj3270、poj1879
Polya定理:hdu1812、hdu1817、hdu2481、hdu1286
容斥原理:hdu2204、hdu3208、hdu1796、hdu2841、hdu1695
8、數(shù)據(jù)結(jié)構(gòu)
串處理、棧和隊列、樹、哈希、二分查找、并查集、線段樹、二維線段樹、哈夫曼樹、后綴數(shù)組等等。
數(shù)據(jù)結(jié)構(gòu)內(nèi)容比較雜,涉及的又都是基礎(chǔ)的知識,其中的很多思想都可以用在其他題目上,一定要學(xué)好。
這里把它作為一個方向,是為了它到了后期的一些高級的數(shù)據(jù)結(jié)構(gòu),例如字典樹、劃分樹、線段樹、AC自動機(jī)等等。
推薦題目:
查找(二分、哈希):poj3349、poj1002、hdu2141、hdu1025
串(AC自動機(jī)、KMP):hdu3695、hdu2203、sdut2411、poj2406、hdu1358、hdu3336
并查集:poj2236、poj2524、poj1182、poj1611、hdu1232
字典樹:poj2503、poj2001、hdu1247、hdu1075、hdu1251
樹狀數(shù)組:hdu1556、poj1195、poj3321、hdu1541/poj2352
線段樹:poj2155、poj1195、poj3468、poj3264、hdu1556、hdu1698、hdu1754、hdu1166
劃分樹:poj2104、sdut2610
9、模擬
模擬就不舉例了,這里只作為一種題型出現(xiàn),沒有什么固定的題目類型。
模擬主要實現(xiàn)麻煩,思路往往不難。只要耐心點,注意細(xì)節(jié),多斟酌斟酌,就沒問題。
推薦題目:
hdu1030、hdu1033、hdu1035、hdu1057、hdu1063、hdu1002、hdu1004、hdu1013、hdu1015、hdu1017、hdu1020、hdu1022、hdu1029、hdu1031、hdu1033、hdu1034、hdu1035、hdu1036、hdu1037、hdu1039、hdu1042、hdu1047、hdu1048、hdu1049、hdu1050、hdu1057、hdu1062
?
最后加個10。
10、STL
STL,Standard Template Library,標(biāo)準(zhǔn)模板庫。
需要了解一下,基本的set、map、vector、queue、algorithm要會用。
很多題目都需要用stl解決,甚至是赤裸裸的考察stl。
Stl的好處在于方便,而且由于它是動態(tài)開辟內(nèi)存,可以解決一些空間開辟不出來的問題。
例如hash空間太大,一下子開辟不出來,可以使用set解決。
?
大三(第三階段):
大三要做的事,只有兩個字:強(qiáng)化。
不要小看這個時期,這可是能創(chuàng)造奇跡的一個重要的升華期。在經(jīng)過前兩個階段的基礎(chǔ)學(xué)習(xí)和方向延伸后,你的算法底子已經(jīng)有了,并且有了一定的見識,了解幾個方向的算法知識。這個時候,你可以沉下心鞏固學(xué)過的知識,以及慢慢學(xué)習(xí)其它領(lǐng)域的知識。這個過程很慢,很艱難,能讓你感到成就感的回饋也少,所以你會感到累,感到辛苦,甚至懷疑自己學(xué)得東西是不是沒用的,而且這個時期受到的外界誘惑比較多,考研,做項目……這些都會讓你分心,但是我想說,一定不要放棄,這是你的瓶頸期,也是你的acm之路的一個考驗,度過去了,你可能就會收獲難以想象的回報。
這里強(qiáng)化的方式有兩個:一是剛才說的看書做題學(xué)習(xí)新知識,二是打比賽。
現(xiàn)在已經(jīng)后期,你要經(jīng)常學(xué)會經(jīng)常打比賽,自己打,跟隊友一起打,一方面可以鍛煉團(tuán)隊配合,另一方面也可以很好的發(fā)現(xiàn)自己的漏洞。同時打比賽也是保持狀態(tài)的一個良好途徑,懶惰?沒精神?沒狀態(tài)?拉到賽場上緊張地做幾個小時題就清醒了。記得我們五一訓(xùn)練的時候,一天一場訓(xùn)練賽,早上睡眼惺忪的到實驗室,還沒伸個懶腰就轟轟烈烈的投入到做題的行列中,讀題、分析、討論、敲代碼,越來越清醒,等到比賽結(jié)束之后,才恍然發(fā)現(xiàn),已經(jīng)到下午了……
?
打比賽也有好多途徑,你可以自己找,也可以聽我的推薦,下面舉例:
1、定期比賽網(wǎng)站
Bestcoder:我們常打的比賽,題目質(zhì)量待考究,不過用來每周練練手還是不錯的。
Codeforces:題目質(zhì)量較高,你的得分rating也是未來找工作的一個可信度很高的衡量標(biāo)準(zhǔn)。
Topcoder:沒打過,聽說很難。
2、不定期比賽
你可以關(guān)注杭電或者其他一些oj的Recent Contests,可以查看其他oj最近舉行的一些比賽。
3、Virtual Judge
Virtual Judge可以抓取各大oj的題目制作成比賽,如果近期沒有比賽了,你又感到寂寞難耐,你可以用它自己給自己出題。
Virtual Judge網(wǎng)址:http://acm.hust.edu.cn/vjudge/toIndex.action
注冊個賬號就能DIY比賽了。
?
另外給出一些推薦書目,大家可以在訓(xùn)練或者學(xué)習(xí)的過程中參考這些書:
劉汝佳系列:
《算法競賽入門經(jīng)典》劉汝佳(小白)
這本書不厚,題目很靈活,拿來入門很好。
《算法競賽入門經(jīng)典(第2版)》劉汝佳(紫皮書)
小白的第二版,沒看這本書,不知道多了什么內(nèi)容,只是變厚了好多……
《算法競賽入門經(jīng)典——訓(xùn)練指南》劉汝佳(大白)
大白看了一部分,語言通俗易懂,計算幾何就是靠它入門的。
《算法藝術(shù)與信息學(xué)競賽》劉汝佳(黑皮書)
很難,大三之前不推薦看。
劉汝佳的書習(xí)題很多在UVA上,國內(nèi)訪問很慢,好像還被墻了,可以FQ過去刷題……
?
《離散數(shù)學(xué)》
《組合數(shù)學(xué)》
《數(shù)據(jù)結(jié)構(gòu)》
參考書
?
《挑戰(zhàn)程序設(shè)計競賽》
據(jù)說這本書不錯,拿來推薦一下。
《算法導(dǎo)論》
這本書放在這是用來膜拜的……
把習(xí)題刷完你就是大神了。
?
后記:
注意三個階段都非常重要,請不要荒廢任何一個時期,俗話說“什么時候做什么事”,這個階段做事情A,下個階段還有事情B要做,所以請珍惜時間,不要三心二意,不要輕言放棄。
轉(zhuǎn)載于:https://www.cnblogs.com/Roni-i/p/7211628.html
總結(jié)
以上是生活随笔為你收集整理的ACM训练计划建议(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大战设计模式【12】—— 迭代器模式
- 下一篇: 动态通过网络获取json来tabbar图