刚开始学acm编程竞赛。。需要一些建议或信息。。有的联系我。。再次感谢
受过ACM等编程竞赛训练的人,在算法上有很大的优势,这说明当你的编程能力提高后,主要的时间是花在思考算法上,而不是写程序和调试上。
这里有一个供你练习的计划:
第一阶段:练习经典常用算法。给我把下面每个算法打十到二十遍,同时自己简化代码。因为太普通了,所以要不加思考的练习写作。你可以在10-15分钟内键入程序,甚至可以关掉显示器。
1.最短赛道(弗洛伊德、迪杰斯特拉、贝尔曼福德)
2.最小生成树(先写一个Prim,Kruscal需要一个并集,不太好写)
3.大数(高精度)加、减、乘、除
4.二分搜索法。(代码可以在五行之内)
5.交叉,判断线段相交,然后写一个凸包。
6.BFS,DFS,熟悉哈希表(要熟悉,要灵活,保持代码简单)
7.数学上有:辗转相除(两线以内)、线段相交、多边形面积公式。
8.调用系统的qsort,有很多技巧,可以慢慢掌握。
9.任意系统之间的转换
第二阶段:练习稍微复杂一点,但也比较常用的算法。
比如:
1.二分匹配(匈牙利),最小路径覆盖。
2.网络流,最小费用流。
3.线段树。
4.检查布景。
5.熟悉典型的动态规划:LCS、最长增长子串、三角剖分和记忆dp。
6.游戏算法。博弈树,二分法等。
7.最大的派系,最大的独立团体。
8.判断点在多边形内。
9.微分约束系统。
10.双向广度搜索,A*算法,最小耗散优先。
第三阶段:
前两个阶段是打基础,第三个阶段是锻炼。在比赛中,你可以快速建立模型,想到新的算法。这就需要平时多做综合题。
1.看了oibh上的论文(大概几百篇,我只看了一点点,呵呵)。
2.平时把zoj上的难题扫一扫,不要老是做那些不用想的题。(CUHK acm的版主经常说我选简单的做:-P)
3.多参加线上比赛,感受比赛氛围,评估自己的实力。
4.如果没有通过一道题,就找人问问,有没有更好的算法试试。
5.记住你做过的题:-)