水平不高怎么拿NOIP一等奖?南京外国语许昊然 比赛经验

本文转自江苏信息学竞赛

本文作者许昊然毕业于南京外国语学校,曾获NOIP 2012一等奖(590分,江苏第一名)、NOI 2012金牌(485分,全国第19名)、IOI 2013金牌(世界第三名),高一获清华保送资格,2014年被美国麻省理工学院录取。

Part I. 赛场策略与技巧

* 首先,如果你的水平已经远超NOIP,自然是想怎么考怎么考了。

* 同理,如果你什么都不会,那么策略再好也是没用的。

* 因此,下面说的策略、技巧主要是针对水平中等,游走在分数线附近的同学们的。

赛场策略的最终目标就是一句话:多拿分。

这是考试,为了分数应当使用任何你能想到的手段。(当然作弊啥的除外……)

多拿分,具体来说就是两部分:

* 会做的subtask不丢分

* 不会做的subtask多骗分

1、先讲一下“会做的subtask不丢分”。

subtask就是每道题目里各个部分分。如果一个subtask你会做,比如遇到了水题,或者某道题你会写30分的小数据,那么请务必确保你能拿到这部分分数。

以及,不要嫌分数少而懒得写!30分也是分,10分也是分,在分数拉不开的情况下(如果你水平并不优秀,这就是你总是要面对的情况),10分的差距就决定了你是一等还是二等。

记住,如果你因为粗心大意,一个简单的subtask没拿到分,你就不得不依靠更难的题目来把这部分分数拉回来。

举个例子,某A,第一题因打错文件名爆零,其余两题满分。某B,只会前两题,第三题写了朴素得30分。最后A得200分,B得230分。难题和水题都是100分,评奖可不管你到底写对的是难题还是水题。

请大家记住:在大多数OI比赛中,只要暴力分全部拿到,就是一等奖(或金牌)。

但问题是,大家都会写暴力,为啥一等奖只有总名额的10%呢?因为大多数人都会把暴力写错,或看暴力分少懒得写。如果你正确写出了所有暴力,不出意外你就是一等奖了。

2、再讲一下骗分的问题。考虑到这里可能有新初一的学生,介绍一下:

所谓骗分,就是用错误的算法拿到分数。按照往年NOIP的经验看,NOIP的数据一般都不强。骗分拿到80分以上甚至满分的分数很常见。

数据是死的,人是活的,出题人是懒的。

数据是赛前就出好的,出题人并不知道你可能会用什么错误的算法骗分。

骗分算法五花八门,你的各种错误的乱搞算法,会让出题人很头疼。

加上出题人一般很懒,再加上NOIP一般每题只有10组数据,你的各种乱搞算法往往都是有收获的。如果你能想出一个出题人很可能没想到的乱搞算法,那你的收获往往就更大了。

常见有效骗分算法试举例:

* 若干个错误的贪心、动态规划取最优解——一个数据同时卡掉多个错误算法很难;

* 暴力算法加奇怪剪枝——出题人不一定想得到你的奇怪剪枝,因此不一定卡的掉;

* 基于某些东西的暴力(比如树上的题目和深度有关、和点的度数有关的暴力等)——原因同上;

* 代码的常数优化——配合上述优化,进一步增加卡过去的可能性。

3、下面我们再说一些技巧性的策略。

我下面说的只是我个人比较喜欢的策略,但这些策略很可能因人而异,因此请同学们不要照搬,找到或发现适合自己的策略。

首先做题策略应该是先做最简单的题目,先拿能确保拿到的分数。

因此,拿到题目后建议先花半个小时左右的时间,把所有题目都看懂,每道题都仔细想一想。原因有两个,一是题目不一定是按照难易程度排列的,都看一遍更容易找到最简单的题。二是,在还没有写代码,头脑比较清醒的时候进行思考更容易想出算法。

如果你发现三道题都会做,而且确定没有看错题,那么你这场考试基本已经尘埃落定了。

当然更常见的情况是,想出了一题或两题的大概做法,还有一题或两题不太会做。本着“先拿确保能拿到的分数”的原则,建议先把会写的分数都写出来。不会的题目的暴力也都应当写一下,因为如果你最后没做出来,那暴力可以交上去拿朴素分;如果你最后做出来了,也需要暴力来对拍。同时暴力也能为正解提供一些思路。

接下来,你的任务就是想出你还不会做的题目了。以下是一些可能有用的方法/技巧:

*  使用草稿纸,有用的性质都可以记录下来,零散的思路也可以画下来,这很有助于思考。

* 尝试加强/放宽题目的条件/约束,得到更特殊的模型。思考特殊模型的解法并尝试推广到原问题。

* 探索是否存在隐藏的性质,尝试从边界、特殊情况开始考虑,猜测、证明性质。

* 是否能换一个思路?从反面思考是否更简单?是否可以利用二分答案之类的技巧进行转化?NOIP的题目对思维深度的要求一般不高,如果想了很久都没想法,可能是你思维方向错了。

* 某某算法是否可能应用于这个问题?逐一确定。(如果你有思维死角,比如总是想不到用某个算法,可以考虑这样)

还有一些我觉得很有效的技巧:

如果想一道题想了很久(比如20分钟)都没有想法,建议去上个厕所放松一下。如果发现了一个可能有用的性质,建议去上个厕所放松一下。如果想出了某题的算法,建议去上个厕所放松一下。如果写完了某题的暴力,建议去上个厕所放松一下。如果写完了某题的正解,要开始对拍了,建议去上个厕所放松一下。如果对拍挂了/通过了对拍,建议去上个厕所放松一下。

如果去厕所不方便,或者觉得太浪费时间,也可以用在座位上伸懒腰、深呼吸什么的代替。目的只有一个:不要让自己长时间陷入某项工作(思考、调试)中。

原因一是人在长时间思考或调试时会效率下降,而且容易“钻牛角尖”,陷入错误的思路中;二是时间也会不知不觉中过的特别快,容易出现类似“卧槽考试只剩一个半小时了还一点想法没有怎么办”这种很糟糕的情况。

因此,如果你想了一段时间却毫无想法/调试了很久找不到问题所在,请务必从中跳出来,换一个思路,切勿陷入其中,白白浪费时间。

总结一下:

会做的题不要写错!

不会做的题,要写暴力!要骗分!

不要钻牛角尖,高效利用时间!

无论发生什么,保持心态稳定!

Part II. 注意事项、低级错误举例

1、关于NOI Linux

听说NOIP也统一采用NOI Linux系统了。考虑到这里大部分同学应该没用过这玩意,以下是一些注意点:

* NOI Linux似乎安装比较麻烦,如果想自己熟悉环境但不会装,用虚拟机装Ubuntu也可以,界面什么都一样的。

* 据说考场是windows下装NOI Linux虚拟机,能适应NOI Linux环境最好,但如果不习惯想直接在windows下编码,请务必记得提前测试能否在实体机和虚拟机之间拷贝文件!否则写完程序发现拷不进虚拟机交不上去就真麻烦大了。

* Linux下64位整数输出是%lld而不是%I64d,不要弄错了。

2、OI中犯低级错误丢分是很悲剧的,也是很不应该的。

下面是一些常见的低级错误,望大家避免:

* 文件名打错/忘记用文件输入/忘记用文件输出/忘记关文件;

* 数组开小;

* 爆了内存限制;

* 运算时爆int,忘记强制转换为long long;

* 对答案取模的题目有地方忘记取模;

* 输出时格式错误;

* 输出64位整数时没有用%lld;

* 提交时交错文件/打错扩展名;

* 等等等等……

Part III. 应当掌握的知识性内容

NOIP近年难度变化较大,也没有考纲啥的。我只能大概给一个列表。

* 模拟、枚举、爆搜、高精度计算等较基础内容;

* 贪心、构造、结论题等比较坑的;

* 动态规划及其优化(以前出过单调队列,但会不会出现更难的就不知道了);

* 基础数据结构(部分和、简单的线段树等常见的维护方法);

* 树论,树形dp,树上的数据结构(lca,倍增祖先,dfs序等);

* 图论,最短路,最小生成树等;

* 简单数论(逆元、快速幂、素数筛法、中国剩余定理等);

* 常见转化方法(二分答案、分治等)、常见技巧(压位等)、推理分析的能力。