acm学习入门指南

原帖地址:http://blog.csdn.net/yueqiq/article/details/7606496

首先要看一些基础的算法书籍,把基本的算法搞懂。像递归、二分、宽搜、深搜、简单的图论、数论、简单的组合数学。重点根据书上的例题理解算法的实质、思想,能做到有一定领悟。这时需要做一些题目来巩固了。
先可以做搜索题,搜索是博大精深的,诸多细节技巧都需要靠平时的积累领悟,根据自己练习的目的挑一些题练习。然后可以做简单的数学题,对组合数学、数论有个大致的概念。
再然后可以做DP 类题目了。DP 也是非一日之功,练好DP 就像练好了内功,这时可以做一些DP 的基础题,体会一下,然后做一些提高题,如果不会做,一定要自己想通为什么别人这样设定状态数组,他的技巧在哪里oibh 上很多的国家集训队关于DP 的论文是必看的
图论里有很多基础的东西需要学习,先把图论里面基本的定义看懂,然后把经典的算法看懂,比如最短路、生成树、割点、连通分量等等。如果不会做,一定要好好看书。
很多新手会问碰到不会做的题目怎么办。首先应该考察一下为什么不会做这题,如果是书本上的知识点没掌握,那要赶紧把书本找来,仔细理解之后再来想这题。如果知识点基本都掌握了,那么可以利用网络的资源,多搜索一下关于这题的讨论,看看别人是怎么想的,看是否可以给自己提供思路。总之一条,要自己多开动脑子。重在理解这一题的算法,而不是只知道算法,自己把它编程实现了就算了。对待算法和程序要用严谨的态度,没有搞懂的地方要花力气把它搞懂,这样才能不断提高。
看书是必须的,而且也是迅速提高的最好方法,不要等到做题时才去理解书上的知识点,而要对知识点有了充分的理解后再去做题,这样才能事半功倍,否则看到难题,从哪方面下手的思路都没有。
高级的贪心,300 行的宽搜,A* ,STL ,诸多的剪枝技巧,统计,查找,treap ,对DP 状态的优化,带集合的DP ,平面图,计算几何,数论...... 要学的东西很多。但我相信只要努力你们肯定会取得不错的成绩。和别人比赛,其实是和自己比赛,考场上完全是实力的体现,会就是会,不会就是做不出来。训练时间每个人情况不一样,长短不一,但重在看个人悟性,水平达到一定程度之后会发现有质的变化,理解算法简直是小菜。
这里强调的还是个思维能力的问题,不是为了做题而做题,做题其实是为了训练自己的思维能力和编程能力,从训练中能得到的最大的收获就是提升了思维,套用比较流行的一个词就是“ 脑力” 。这也是为什么说进省队是个标志,进了省队说明你前期有了一定的积累,和那里的一些高手一接触自然自己的思路就大大开阔了,对于算法会有一个更深层次的理解。就算只参加了省队的选拔赛,对自己的帮助也是很大的。用一牛人的话说,没进过省队就等于没见过世面。
那大家一定达不到那些现今强人的水平吗?当然不是。强人不是天生就强的,也是从菜鸟做起的,成功地原因只有一个- ——勤奋。他们的思维能力或者脑力不是天生就这样的。但随便提现今的一个牛人,题量都是上千。他们默默地积累和严谨的态度才取得了现在的成绩。有人说上千题,太恐怖了啊,我做一个题都得花几小时,有些想几天还做不出。一开始自然是这样,知识点众多,考查范围广大,对这些现成的知识要慢慢消化,每个知识点都掌握后,做只考这些知识点的题自然就快了。积累到一定程度后就会发现做题的乐趣,以前很崇拜那些说“ 今天上课太累了,做几道题休息一下” 的人,不知不觉,做题对我来说也成了最大的乐趣。有些题只考查单一的知识点,有些题把几个知识点结合起来考查。比如先用平面图里面的几个知识点,然后凸包求一下,然后DP 一下,或者线性方程组解一下再搞个匹配等等,这些题看上去很复杂,但若这些知识点都不折不扣地掌握的话,做这些题自然就像切菜了。题目也是人出的,如果只看现成的这些知识点的话,出题者的思维也是有限的。
参加这个比赛对编程能力的提高也是大有好处的,十分钟上百行无错代码,快速实现逻辑较复杂的算法,debug 技巧...... 而且对语言的理解也能上好几个台阶。我们还没有迎来下一次的编程技术革命,编程仍旧是有局限的,它强迫我们像计算机一样思考,而不是令计算机像我们的大脑一样思考,这是我们需要花巨大的努力去克服的。很多人对我说的这句话可能不太理解,至少感受不深。如果Debug 的时间超过写程序时间的1/2 ,那就是失败的。一切都要慢慢训练,持之以恒之后,拥有良好的编程习惯和风格应该是每个人所追求的。编程的境界永无止境!
以前人们常说看书可以升级大脑,对于计算机及其相关专业的同学来说,参加acm 比赛是最好的升级大脑的方法,思维能力的提升可以让我们受益无穷,而编程的能力和技巧则会因为编写大量的代码而大幅提高。或许今后再也没有这样一个机会能让你计算机水平飞速增长。对算法和数据结构理解深入后研究计算机专业的其他课程有如“ 会当凌绝顶,一览众山小” 。所以低年级的同学全身心的投入进来是绝对有好处的。有一年多的积累就能小有成绩了。只要坚持下来,踏踏实实,努力提升自身水平,一定可以实现自己的目标!
做acm 看似是枯燥的,但一旦入了门,就会发现其中有无穷的乐趣,即使训练了不参加比赛,对自己也是一个很好的提高。
知识的积累固然重要,但是信息学终究不是看出来的,而是练出来的,这是多少前人最深的一点体会,只有通过具体题目的分析和实践,才能真正掌握数学的使用和算法的应用,并在不断的练习中增加编程经验和技巧,提高对时间复杂度的感性认识,优化时间的分配,加强团队的配合。总之,在这里光有纸上谈兵是绝对不行的,必须要通过实战来锻炼自己。

你可能感兴趣的:(acm学习入门指南)