程序设计竞赛专题挑战教程
上QQ阅读APP看书,第一时间看更新

如何高效备赛

刚接触蓝桥杯软件类大赛的参赛者往往有这样的困惑:大赛似乎很难、很花时间,不仅难以入门,而且学习成本很高,往往需要半年以上,甚至一年、两年的勤奋学习,才能获得较好的成绩。

本书正是为了解除这样的困惑而编写的:通过本书的学习,你能从一名算法竞赛的“小白”,开始成长为熟悉算法知识、构建起算法思维、拥有高效编码能力的计算机编程人才。

好学上进的你肯定有这样的期望:我想得奖,尽快得奖!

这本书是得奖的捷径吗?答案是确定的!然而,“捷径”往往是“艰难”的代名词。“捷径”并不一定意味着省力,正如爬山的捷径往往更陡峭、更令人费力一样。在算法竞赛的学习这件事上,“捷径”意味着要付出更大的努力,要进行高强度的学习。本书之所以能成为得奖的“捷径”,是因为所提供的知识点更为集中、讲解更清晰、题目设置更有针对性。是否能走通这个“捷径”,取决于你愿意付出多少时间和精力。

学习算法竞赛,请注意以下几个重要问题。

1.刷题

在面向算法竞赛的所有学习方法中,最重要的一种方法是“刷题”。也就是大量做题,在做题时进行建模训练和编码练习。只读理论、只看书,而不做题,学习效果只会略大于零,能力得不到提高,肯定不能得奖。《天龙八部》里的王语嫣,是位武学理论大师,但手无缚鸡之力,打不过一个没学过任何武功的人。要成为真正的编程高手,只能通过大量做题,才能真正理解算法知识、提高编程能力,并在竞赛中发挥出水平。

那么,“刷”多少题合适?本书介绍了算法竞赛中处于初级和中级层次的知识点,读者可每个知识点做10~20题,总共要做600~1000题,多多益善!

初学者问:“啊,要做这么多题吗?太累了!”

我的回答:“没其他办法,这是算法竞赛的必由之路。”

2.速度

参加算法竞赛,编程速度极为重要。蓝桥杯软件类大赛要求在4小时内完成10道题,时间非常紧张。因而,编程速度是所获奖项级别的重要影响因素。

如何提高编程速度?读题要快!对于每道题,都需要建模后才能进行编程。在竞赛时能快速读完题目并思考出合适的算法,是需要经过大量做题训练的。训练会提高大脑的兴奋度,用最快的速度理解题目并建立计算机编程模型。

此外,为加快做题速度,还需要注意以下3点。

(1)熟练掌握集成编译环境。

(2)减少调试,最好是写完程序后,争取一次能通过测试样例。为了减少调试,尽量使用不容易出错的方法,例如少用指针、多使用静态数组、将逻辑功能模块化等。注意,不要使用动态调试方法,不要用单步跟踪、断点等调试工具。因为这样会很慢,况且算法竞赛的代码不长,用不着这样做。如果需要查看中间的运行结果,就在代码中的关键地方打印出调试信息。

(3)使用库函数。如果题目涉及比较复杂的数据处理,或者像sort()这样需要灵活排序的函数,用库函数可以大大地减少编码量,并减少错误的发生。注意积累C++、Java、Python编程语言的库函数。

3.模板

模板是某些数据结构、算法的标准代码,可谓计算机科学发展过程中众多高手提炼出的“精华”。

初学者问:我想速成,来不及做很多题,不过我可以多准备一些模板,竞赛的时候套一套模板,是不是也能获奖?

我的回答:模板有用且需要掌握,但是,在赛场上模板的作用有限。

模板很有用,例如并查集模板、快速幂模板、埃氏筛模板等,需要参赛者牢记并熟练应用。学习经典算法时,往往也需要整理模板并要多次地学习和使用。有必要强调的是,对于模板中的代码,参赛者得真正理解并多次使用过,才能在做题时快速地应用于编程。

有的算法竞赛可以带纸质资料进场,相当于开卷考试,例如ICPC、CCPC,有不少参赛者带了打印出来的厚厚一沓代码资料和各种书籍进场竞赛。但是,蓝桥杯软件类大赛采用的是闭卷形式,禁止带任何资料进场,因而参赛者要完全靠脑力,模板要靠“背”!这就增加了一定的难度。

不过,把模板带到赛场上用处大吗?答案是“90%的否定”!换句话说,想靠模板速成、急着用来参赛获奖是不现实的。

首先,赛场上的题目基本是新题,也就是以前没有出现过的(按道理是这样,至于命题人是不是按道理办事,就是主办方的责任了)。做题少、对知识点理解不深的初学者难以知道应该套用哪个模板。

其次,不能直接套用模板。不同的编程题目,即使用到相同的算法或数据结构,也往往不能直接使用同样的代码,而是要作出很多修改,因为不同环境下的变量和数据规模是不同的。对于模板的学习和使用,需要花时间融会贯通,不能急于求成。参赛者应在深入理解和熟练地掌握模板之后,才能将之应用到竞赛解题中。为了避免参赛者直接套用模板,蓝桥杯软件类大赛的命题人甚至会在出题上“绕圈子”。因而不能原封不动地“抄”模板,而是要灵活运用。

初学者看到这里,可能想打退堂鼓了。但是,请记住“成本越高,收益越大”。学习备赛累、提高编码水平累,这的确是一道门槛,但也正是如此才能筛选出真正的计算机编程能手。如果一个技能很容易掌握,那这个技能大多是大众化的,含金量不高;而像蓝桥杯这样的竞赛,的确是不好学且学习成本高,但能学出来的就是高手,毕业后也能有更光明的就业前景。

有学生是零基础,是刚开始学编程语言,想等学完之后再开始算法竞赛的学习。不要等!因为算法竞赛的编码用不着复杂语法,而且初学者也能将竞赛题当成编程语言的练习题来做。

自主学习,最大的动力是自己!也要找同学一起学,不要自己一个人,有难度的学习,需要互相鼓励,一起进步。

让我们一起走进算法竞赛的“星辰大海”!