作为一个ACM搞了没多长时间的人,与其说是谈经验倒不如说是对我ACMer生涯的总结,也算是对新人的一些告诫和路线指南吧!
- 初入ACM界
怎么说呢,第一次听说有这么个东西是在刚学完数据结构的时候,听说学校有这么个神奇的组织专门参加国际大学生程序设计大赛(ACM),而且是需要有很好的数学功底和精湛的编程技艺才适合参加,上网查了查,能在这方面有所建树那可是会被计算机界的各大龙头公司所认可并录用,作为一个有理想有抱负的计算机青年,我心动了。。。想当时我也自认为对数据结构有所研究,就满怀着希望加入,从此踏上了不归路。。。。。。因为学校在这方面不重视,学校有一个ACM实验室,在我之上只有没几届的学长在做这个,而且没有什么成就,加入之后学长就说“好好做吧,争取能做出点成绩,一定要坚持住做下去”我就想了,这个真这么枯燥无味,我也是比较爱好这个吧,难道还坚持不了,但事实证明,在不远的将来,我才领悟到坚持到含义。。。。哎,刚开始写怎么就偏离主题变成感情抒发了,完全忘了这是技术支持文档,看来真的被伤了啊。。。还是步入正题吧,不过真心想搞的人一定要在心里刻下一个词-----坚持
- 初学者应该做的
- 找到自己学校稿这方面的人,争取能加入他们,一方面是更多的获取前人的经验,另一方面这样可以避免走弯路,而且有些人和你一起搞你才不难么容易放弃,如果被你找到了这么一群人,恭喜你,你是最有希望在这条路成功的人,下面再看不看已经不重要了,他们会慢慢告诉你。如果没有,兄弟,你要付出的努力可就多了。
- 在搞这个之前最好能掌握一门编程语言,我说的掌握不是能编,是能进行熟练的调试程序,因为搞这个到最后真正困难的其实是把一个你知道的思想调出来。不过如果你有一颗不屑努力的心,慢慢锻炼也未尝不可。
- 在国内的在线测试平台注册一个账号,北大、杭电什么的都行,关键是得有一个。
- 然后就是漫长的练习过程,上网找一些模块学习顺序,个人认为先输入输出(这个主要是熟悉平台),再数论,再排序,再搜索,再贪心、动态规划。在你有充足的时间的情况下,还是分模块循序渐进的练习,方法就是上网找相关的题,花时间练、调试。刚开始一般比较顺,到后面花个几天甚至几周调一道题很正常,还有可能调不出来,搞ACM的真的伤不起啊。
- 算法学习
- 刚开始练习经典算法,并精简代码,练到非常熟为止,也是对变成能力的提升。
1.最短路(Floyd、Dijstra,BellmanFord)
2.最小生成树(先写个prim,kruscal要用并查集,不好写)
3.大数(高精度)加减乘除
4.二分查找. (代码可在五行以内)
5.叉乘、判线段相交、然后写个凸包.
6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简)
7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式.
8. 调用系统的qsort, 技巧很多,慢慢掌握.
9. 任意进制间的转换
2. 练习复杂一点的算法。
1. 二分图匹配(匈牙利),最小路径覆盖 2. 网络流,最小费用流。 3. 线段树. 4. 并查集。 5. 熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 6.博弈类算法。博弈树,二进制法等。 7.最大团,最大独立集。 8.判断点在多边形内。 9. 差分约束系统. 10. 双向广度搜索、A*算法,最小耗散优先.
- Tips
- 会使用平台的讨论区,POJ的是每题的discuss,在网页下面,和提交在一起,这个往往会给你一些重大灵感
- 多上网搜大牛的解题报告,ACMer中真的有那种巨强的人啊,看他们的代码简直是一种享受(很希望POJ能把每道题提交的最好的程序开放出来,我一度很疑惑那些时间0、空间0的程序是怎么编出来的)
- 自己也要做解题报告,这个不一定发到网上给别人看,到了后期自己再看其实是一种再学习,有很多精妙的东西记录下来才不会忘
- 总结经典算法、子函数、输入输出格式,因为比赛时是可以看资料的,当你发现有道题可以直接拿以前的函数来用,或稍加修改就能用,那岂不是在比赛中比别人占了先机。网赛的时候经常看到比赛开始一分钟就有队伍提交了,这就是总结的好处
- 对于比赛,中国一般是五个赛区,官方说一般一个队伍只能报2、3个赛区,但这个必然都报啊,竞争这么激烈,有些ACM大校都是N多组做到实验室里刷的,让我们这种小队伍情何以堪,而且注册时一般都是有马甲的,因为比赛既要算做出的题目个数,也要看提交的次数,而且一般是不怎么查的。不过我感觉如果足够NB的话,可以完全无视提交次数,单凭正确题数即可进入现场赛。
我的经验就先这么多吧,有什么需要网络是你最好的帮手,最后告诉你一点:坚持,坚持,还是坚持
预祝各位在ACM的道路上成功。