http://poj.org/userstatus?user_id=18010594296
大一(第一阶段):
大一是时间最充裕的一段时间,也是可塑性最高的一个阶段。大一你有很多自由时间可以自己分配,建议这段时间先打好c/c++基础,或者是任何一门语言的基础,尽量做到“半精通”。因为像c++这种语言,几年内达到精通都是不可能的。而我这里所说的“半精通”,实际上是将课本完全搞透的基础上,再在课外拓展一些内容,加深对语言本身的理解。
为什么我这里强调语言的重要性呢?一方面是为了以后搞acm的需要,语言通畅了,可以保证你实现大部分算法没有障碍,而比赛时,时间是很重要的。另一方面,也是你身为学计算机的学生的一个必须要学习的能力,语言就是你手中的剑,以后能披荆斩棘走多远,剑有多锋利占很大因素。
另一方面,建议打好数学的基础。学长身为过来人,深受数学烂的苦。acm越到后期的时候,其实用到的数学知识就越多。像有些题目,赤裸裸的就是求积分,还有一些题目,将求期望嵌入到了DP的题目里…… 其实这些还好说,都是显式的题目,还有一种隐式的东西,对acm帮助最大,那就是数学思维。有数学思维和没有数学思维的区别,就是一道题有N种思路和N*N种思路的区别。这越到后期越明显,思路很重要,比赛时面对一道题团队里首先要有多种思路可供分析,然后大家讨论哪种思路是最可行的,确定之后就是最擅长这个思路的人实现算法。如果分析一道题目的时候,产生的思路很少,那么无疑会降低这道题的AC命中率。
啰嗦了这么多,其实我就想给大一的新生们强调两点,语言和数学。
具体的实现策略,数学的话,好好上课,把课本搞明白。
语言的话,建议:课本+刷题 | 不会的问老师。
这个阶段刷题的话,除了咱们学校的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又是团队配合的比赛,所以你可以和队友每个人负责专攻几个方向,这样比赛时不会出现一道题谁都没思路的情况。另外建议每个人专攻的方向要有一定的交集,不然比赛时,没有人和你讨论,会降低这道题的正确率。事实上,到了后期,我们队(仅仅是我们队)没有依赖这种模式,而是改成了两个人讨论思路+一个人敲代码,这是根据各队的特点安排的。当然我认为分方向还是有必要的,因为这合理分配了团队中每个人的精力,并在短时间内保证了团队的知识面没有漏洞。毕竟一口是吃不成胖子的。
下面给出我们划分的几大方向,给大家做个参考(排名不分先后)。
1、数论
2、图论
3、动态规划
4、计算几何
5、搜索
6、博弈
7、组合数学
8、数据结构
9、模拟
个人对这九个方向的印象和推荐题目(部分转载):
各方向题集可以参见链接: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基本上就是难题了……
不开玩笑,动态规划很难,需要时间的积累(多做题),需要锻炼的是用动归解题的思想,这急不来。
推荐题目:
背包问题:hdu2602、poj3624、hdu2546、hdu2955、poj2184、hdu2639
树形DP:poj1155、hdu1011、poj1947、hdu1561、hdu4003、poj2486
概率DP:zoj3383、zoj3460、hdu4405、hdu4336
数位DP:hdu2089、hdu3555、hdu3652、poj3252
4、计算几何
点积和叉积、线段相交、多边形面积、凸包、半平面、圆与点的切线、圆与直线的交、圆与圆的交、圆与多边形的并和交、三维凸包、三维点和直线等等。
计算几何内容繁杂,实现麻烦,精度问题更是让人纠结(本人负责的方向,学习的时候各种泪啊,两次省赛还都没考到……哭)。
推荐题目:
点积和叉积: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博弈、尼姆博弈、公平组合博弈等等。
博弈不熟,好像是找必胜态,当然也可以找规律……
博弈代码一般都很短,只要分析出来公式(或规律),不难实现。
推荐题目:
poj1067、poj1740、poj2234、poj1082、poj2348、poj2413、poj2419
7、组合数学
容斥原理、抽屉原理、置换群与Polya定理、母函数等等。
记得第五届省赛出了好多组合数学的题……
推荐题目:
置换群:poj2369、poj1026、poj1721、poj3270、poj1879
Polya定理:hdu1812、hdu1817、hdu2481、hdu1286
容斥原理:hdu2204、hdu3208、hdu1796、hdu2841、hdu1695
8、数据结构
串处理、栈和队列、树、哈希、二分查找、并查集、线段树、二维线段树、哈夫曼树、后缀数组等等。
数据结构内容比较杂,涉及的又都是基础的知识,其中的很多思想都可以用在其他题目上,一定要学好。
这里把它作为一个方向,是为了它到了后期的一些高级的数据结构,例如字典树、划分树、线段树、AC自动机等等。
推荐题目:
查找(二分、哈希):poj3349、poj1002、hdu2141、hdu1025
串(AC自动机、KMP):hdu3695、hdu2203、sdut2411、poj2406、hdu1358、hdu3336
并查集:poj2236、poj2524、poj1182、poj1611、hdu1232
字典树:poj2503、poj2001、hdu1247、hdu1075、hdu1251
树状数组:hdu1556、poj1195、poj3321、hdu1541/poj2352
线段树:poj2155、poj1195、poj3468、poj3264、hdu1556、hdu1698、hdu1754、hdu1166
划分树:poj2104、sdut2610
9、模拟
模拟就不举例了,这里只作为一种题型出现,没有什么固定的题目类型。
模拟主要实现麻烦,思路往往不难。只要耐心点,注意细节,多斟酌斟酌,就没问题。
推荐题目:
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,标准模板库。
需要了解一下,基本的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要做,所以请珍惜时间,不要三心二意,不要轻言放弃。