转眼间本赛季USACO 的第二次月赛就要开启了(美国时间1月28日开始,这个时间也正好赶上了春节假期,很多学生现在都处于放假期间,正好可以抓住最后的一周时间,再努力突击一把,争取在本次月赛中能够顺利晋级!
那么到底应该如何进行考前准备呢?是把最近两年的题目再刷一遍?还是应该把之前学习的算法拿出来从头再过一遍?或者再到一些刷题网站上,找一些算法相关的题目刷一下?
到了这个阶段,再盲目的去刷题已经意义不大了。已经学习过的算法,可以简单的浏览一遍,系统的再去看讲义和视频学习一遍,也意义不大,因为这样重复学习的方式早就已经被证明是效率比较低的学习方式。而最近几年的题目,相信学生们应该也已经早就做过了,如果真的竟然还没有做过,那赶紧刷一遍,还是有意义的。
对于已经学习完当前级别算法,并已经刷过了最近几年真题的同学来说,在这一周时间内,我倒是建议可以从两个方面针对性的查漏补缺一下。
我们知道,USACO考核的核心能力主要是两个,一个是问题分析的能力,另外一个就是代码编写的能力。前者重点考核学生是否能够根据题目给出的数据和条件,找到蛛丝马迹,然后和算法关联起来,使用算法一步步解题。后者则是能通过代码来表达算法思维,把算法精准的编写成代码,让计算机按照既定算法工作。
所以最后一周的突击练习,也应该围绕这两个方面进行开展。题目可以就选历年真题,即使这些题目曾经做过也不要紧,因为本来就是使用这些真题来训练解题的感觉。
看到题目后,不要翻看之前的代码,重点是把问题的所有已知数据,条件和求解数据都罗列出来,然后思考这些信息之间的关联,并考虑应该使用什么样的算法来解决这道问题,以及为何要使用此算法来解决该问题?事实上,每种算法都有其使用场景,当能够分析清楚题目中给定的信息后,一般就能锁定在几种算法之内。例如题目的求解数据,如果能够直接通过已知数据和条件推导出来,那么一般都是使用模拟算法。如果求解数据无法直接推导出来,而是需要根据求解数据的范围进行假设设定,那么这类问题很可能就是枚举算法。也就是说,通过这样的分析训练,尽量构建和总结一种题目信息到算法的映射关系,这样参加竞赛时,就容易根据题目快速确定对应的算法。
对于有些题目,算法的实现上会比较复杂,这种题目是值得重新实现一遍代码,加强自身的代码能力的。铜牌组的代码实现一般都不太复杂,但是银组及以上级别的题目,代码实现还是有一定难度的,很多代码还有一些技巧性。找几道曾经无法独立完成代码的题目,尝试根据算法思路再完整的编写一遍代码,这个过程能有效提升代码能力。很多学生对于代码总停留在理解层面,觉得看了答案的代码,已经能够完全理解了,但是理解和自己能够编写出来是两回事。都说好记性不如烂笔头,应用在代码编写上也是适用的,独立的编写一遍后会形成更深刻的记忆和理解。
以上的这两种训练方式,学生可以根据自己当前水平进行针对性训练。如果你平时做题的时候常常缺少思路,那么就用第一种方式建立题目与算法的关联,如果是代码编写上存在问题,则使用第二种方法,好好找一些曾经做过的难题,再独立编写一下。相信经过了这样的突击训练后,你一定会针对性的进行提升,从而能够更好的应对本次USACO月赛!