书籍推荐:绿书+蓝书(青少年信息学奥林匹克竞赛培训教材 系列)、算法导论、粉书(全国青少年信息学奥林匹克联赛培训教材)、黑书(算法艺术 建议水平高的人看)、新编实用算法(建议水平高的人看)
题库推荐:Usaco(强烈推荐,很经典的题库,Nocow有翻译)、Vijos(一个非常不错的中文题库)、Ural(水平有所提高了可以去做做,也有很多经典题)、Rqnoj(题目质量不是太好,不过也是一个题库)
需要学的知识:40%来自于书本、40%来自于做题、20%来自于网上其它的资料(至少我是这样)
我的OI技巧:
1、 学会总结,我基本上每学完一个章节的东西就会拿多一段时间来进行总结。总结的时候,先列出一个目录,把这一节学到的知识点写进去。然后在下面分别拓展出这个知识点的原理、用途、编程流程、关键代码、优化、和其它同类算法的比较、复杂度估计、模块化代码、相应习题等等。这样,可以很容易的把一个一个的知识点串在一起记住它。(附录里有我的总结样例)
2、 要拿出一定的时间看书,书是人类进步的阶梯。相信很多OIer都很喜欢做题,忽略了看书这个重要的环节。其实只有阅览群书,才能学到更多的知识。例如,某个算法你会N^3的算法,但是某本书上用N^2,甚至N的复杂度就给解决了。如果不看书,如果考试正好出这个知识点,或许你就只能拿部分分了。
3、 合理安排时间(特指放假或集训的时候)。清晨7点到9点这段时间,是人们头脑最清醒的时间,这个时间段内,尽量不要去调程序,可以去做一些其它的事情,比如看书、总结等等。而9点之后这段时间,建议去做题,这个时候一般花一个小时就可以编出在其它时间要花一个半小时才能编出的程序。到了中午,吃完饭一定要睡觉,否则下午会很没精神,效率会很低的。下午呢,一般就比较综合了,比较随意了,可以自己安排。晚上,我一般都是继续调程序,因为想不出晚上干什么会高效一些。
4、 学会适当的休息,不要长时间干同一件事情。当你编程序进入了一个死角的时候,或许思维会很混乱,总想找出错误或优化这个算法,但是一片空白,很盲目。这个时候,你真的需要休息。去外面小小的溜达一圈,看一看窗外的风景,这样就可以换一个心情,换一个思维。在你休息完之后,你会发现,刚才你之所以找不出错误,是因为身在此山中。
5、 养成编代码的良好习惯,这个各位可以参考其它大牛的程序。我的程序一般都是用过程堆起来的,每个程序必有的Init和Main过程,可能Init里只有个read(n),但是为了保持程序美观,完整个人的习惯,还是单写了一个过程。但是不要大量的调用过程,比如在某个3重循环里调用过程,因为调过程也是需要一定时间的。除了这个,我还在每个过程中间添加了一个分割线,以便阅读。还有,各位还需要注意换行、空格等问题,养成良好的习惯,尽量使其美观,方便阅读(附录里有代码样例)。
6、 学会心理暗示。这个也是很重要的,当你做不出某个题的时候,一定不要乱,心理默默的暗示自己,既然自己不会,别人做起来一定也不会舒服。当你做出某个题,一定不要盲目的高兴,要把自己的思维控制住,这样才能用形象的思维去做下一个题,所以我们一定要暗示自己,这个题自己会做,别人做起来也会很容易的,不能骄傲。
7、 学会抗干扰,干扰有很多类,大概就是人为、自然因素。人为因素,当别人早早的做完题或者别人在说话、讨论的时候,一定要控制住自己,不要慌乱,否则你可能会编的程序最后得个0分,所以一定要在众多次干扰中,积累抗干扰的经验。自然因素,当太阳直射你的时候、当寒风呼啸你的时候、当键盘生硬难敲的时候、当屏幕反光的时候,你一定要学会去适应,因为很多时候在考场上会出现这样或者那样的问题,给你的只有3个小时,没有多余的时间去考虑这些无关的问题,只能适应。综上所述,抗干扰很重要,即使没有干扰,我们也可以为自己去制造干扰。
8、 写程序的流程要合理安排,这个很重要,也是非常重要的。我就把自己是怎样做的写出来吧,可能不是太好,只是一个借鉴。1)我会用大概5分钟左右去完整的阅读题目,因为多一点时间阅读题目,总会有意想不到的发现。2)用10-15分钟的时间去设计算法,要尽量躲避第一印象思路,因为这个思路往往是错的,设计算法不仅要证明这个算法的正确性,还要从时间、空间等因素来考虑是否,千万不要很草率的结束这个过程,因为当编完程序再来改正错误的算法,往往会浪费更多的时间,例如说高一的我,看见题就想做,大概理出了思路就去编程,但是反过头来发现,其实是错的,结果浪费了时间不说,心情还很不好。3)利用5分钟的时间写出程序的框架,第一步该干什么,第二步又该干什么,一步一步的写出来,再对每一步进行一些拓展,写出关键的伪代码等等。这样,才能让自己在编程的时候条理性清晰,才能降低出错的几率。4)编程10-20分钟,前面的工作都做好了,这个过程应该是非常容易的,注意不要犯打错变量等低级错误就行了。5)查错10-20分钟,往往第一次编出的程序都是错的,具体的查错技巧下面会写出来。这样,一个程序就算写完了,我这个算法流程只是提供一个参考,具体每个流程的时间大家可以看情况去安排,一般简单程序30分钟敲完,中等点的50分钟,难点的1个小时左右。这样才可以更上NOIP3个小时的节奏。
9、 静态查错。这个是很重要的,也可以说是非常重要的。何谓静态查错,就是编完代码之后,不去干其它事情,只是安静的从头到尾的把自己的代码阅读一遍,比如说普通的编译错误、变量是不是打错了、数组开的够不够大、程序的逻辑性是不是还存在问题等等。这个时候,一般是很容易发现错误的,并且还会有一种成就感。但是如果你编完之后去测样例,可能样例是过了(因为样例是很弱的数据),但是其实程序仍漏洞百出,或者测样例都错了,这个时候会严重影响你的心情,再去查错的话,事倍功半。
10、 出测试数据是个大学问。测试数据一般分为,小数据、大数据、极限数据等等。所以我们一定要从这几个方面,各出几组测试数据。小数据可以手算,很容易出结果,相信是OIer最喜欢的。极限数据也是指那些边缘数据,比如说某个数据导致你数组越界、被0除等等,一般很多题目都存在一两组这样的数据。大数据的话,一般是去检验程序是否超时间和超空间,因为结果是否正确,真的很难手算出来,除非很离谱的错误。
11、 检验程序的正确性,这个除了设计算法时的证明外,如果有时间允许,我们还可以写一个效率低但是绝对正确的算法来和原程序进行对比。这样,我们利用上面出测试数据的学问,加上这个手段,一般可以80%的判断出你写的这个程序是否正确,进而不断完善。(还有一个小技巧,就是利用.bat文件,判断两个输出是否等价。具体怎么用,可以看附录)
12、 善于交流,这个就不知道怎么说了,就是多和其它人交流。
其它:1)培养对OI的兴趣。2)胜不骄,败不馁。3)不抛弃,才有希望;不放弃,才能成功。4)天才是99%的汗水+1%的灵感,对学OI尤其适用。5)学完某个算法时,尽量把模块化代码保存下来。6)如果NOIP一等奖名额只有1个,那么相信自己就是那一个。7)制定好目标,分为远大的目标(上哪个大学),中期的目标(拿一等、冲省队、夺金牌),近期的目标(学会哪个算法、模拟赛要达到多少分)。8)赛前一周多复习,多做简单题,不要再去钻高难度的题,这是NOIP不是NOI。9)专心致志,学习时就不上QQ,不上论坛。10)细心,细心,再细心。
希望各位OIer以后回想起自己的OI时光,不要为自己留下遗憾。
最后,祝各位OIer学习进步,Rp++,在NOIP中狂拿1等。
尤其是BDEZ的新OIer们,希望你们可以创造更大的辉煌。向前冲,为了梦,突破极限的感动,Everything’s we can do,超越自己就成功。