信息学竞赛NOIP考试答题策略
竞赛考试经验
对参加NOIP青少年信息学奥赛的考生,我们整理和收集了一些答题策略给家长和学生参考。
考场策略和程序测试是信息学竞赛中非常重要的环节,很多的选手在很多比赛中总是会在这两个环节上犯下这样和那样的错误,导致得到的分数和实力不成正比,较后留下了无尽的遗憾。我们收集和整理了一些值得家长和考生注意的地方,提出一些可行的方法,分享一些经验,以此希望帮助考生在比赛中发挥水平,减少失误,告别遗憾。
整体规划
一场信息学竞赛,比赛时间都是好几个小时,连续做几道大题。在这样的一个长时间“烧脑”的过程里,考生如何分配时间,如何对待考试的题目,用什么方式和顺序对待题目等等一系列的决策问题,都需要一个考场策略来帮助考生获得更好的成绩。
整个答题策略可分为这几步:
读题->分析题意->找出算法->编写程序->手动测试:样例、自测数据->文件测试:与样例对比。
5个注意点
(1)浏览试题,阅读并分析。
(2)先易后难,每完成一题要调试好、保存好。
(3)容易题要增加测试数据全过,难的问题尽可能取得一些边界分数。
(4)阅读要仔细,分析要全面,可借助图示等方法理解题意。
(5)注意数组是否越界!全局变量与局部变量尽量不相同。递归有层次限制,较多层数与程序大小、电脑配置有关。考虑特殊情况和极限情况。注意经常保存文件!
考场策略
策略1:认真审题
这一点非常重要,一旦审题错误或者理解错误就可能造成你花很多时间写出来的程序 WA。如果没有思路,可以尝试着多读几次题目。
很多考生觉得这花去的时间太多了,大大占用了之后的解题时间。但是无数的事实告诉了我们审题的重要性,无数的遗憾正是由审题开始的。
策略2:考虑严谨
如果考虑不严谨就可能被特殊数据卡分[0,100]而特殊数据往往分为极端数据和特殊数据。极端数据会按数据较大范围来,所以要注意空间是否足够,int 是否会溢出;数组的大小是否合适。特殊数据往往是具有特殊情况或性质的数据往往需要特判。
策略3:关于时空复杂度
通常 1s 运行时间较放心的时间复杂度为 1e6, 时间复杂度为 1e7 时尽量降低代码常数,时间复杂度为 1e8 时尽量不冒险。
查询空间复杂度可用 sizeof 函数。
sizeof(T)返回存储一个类型 T 的对象所需要的字节数。
sizeof(数组)可得数组所占的字节数大数组开全局变量。
策略4:关于文件读写
freopen文件输入输出是非常重要的一部分,一旦写错一点,就会丢掉该题的全部分数先按照平时流程完成代码,确认代码无误且没有输出多余的调试语句后,再加上文件输入输出以及头文件,再次编译,编译无误时则可认为完成该题。
策略5:重检查
即使选手也可能会犯低级的错误,在重大的比赛中要告别遗憾,必须重视检查这一环节。
每道题目都要检查,我们推荐写完立刻检查,因为此时的印象较深刻,效果较好,同时检查完毕后就排出了这倒题目对后面比赛的影响,更容易让人在后面的时间里面集中精力。
考试过程中要巧用对拍检查,还有注意检查你的程序是否在考试指定文件夹里面,名称是否正确,尤其是。cpp/.in/.out 的名称。
策略6:关于头文件和考试平台
头文件:#include<bits/stdc++.h>
若在考前不能确定是否能用头文件(一般是可以使用的),请使用以下的常用头文件:
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<list>
#include<set>
#include<stack>
#include<vector>
#include<deque>
#include<map>
#include<cstdlib>
由于评测环境是在 linux 平台下,切记不要使用 linux 平台没有的头文件,如
#include<windows.h>。
一些英文变量的命名可能与 linux 平台下的关键字冲突,但在 windows 平台下可以编译通过,如 time 等,使用英文变量名较好首字母大写。
不能使用的变量名:dfs、next、search、index、pow(幂函数)、min、max、y1、x0、link、map、pipe,ws。
策略7:先易后难
现在的题目普遍会有部分分可以拿,而很多的时候即使想出算法,实现这些算法未必在考试时间内能够完成,所以这时候就应该根据考场的情况,比如时间,难度,剩余题目的数量来判断是应该节约时间拿到一些部分分,还是花时间思考和实现算法。
策略8:冷静判断
想到了一个算法并不能直接予以肯定,而是要先否定他,想想有什么漏洞,或者想想是否有更好的方法,莽撞的立刻动手写题往往会浪费更多的时间。
策略9:暴力出奇迹
当想不出来正解的时候,根据数据范围分段写暴力、骗分。可用 namespace 封装几个分段的做法,避免变量命名重复以引起冲突。遇到高精度的题目,先写低精度,再写高精度,并用低精度做对拍。任何题不管有没有思路,都可以写出较简单的暴力做法骗分(一眼能够看出怎么做的题除外),有时间再逐步思考正解。
策略10:较后10分钟
在考试的较后10分钟时间里,我们建议不要再写程序,此时此刻考生在考场上能想到的和应该拿到的分数基本已经定型,这时候选手应该核对检查是否注释了改注释的东西,文件名是否写对,特别要检查有没有多余的空格,文件夹是否建对等基本的东西,防止考生较后因为这些基本的事情没做好出现零分,每年基本都有考试因为不注意这些事情而发生“爆0”的悲剧。
考生较后10分钟检查核对参考:
(1)核对所有代码的文件名是否按照考试要求。
(2)freopen()里的文件名是否写对。
(3)中间计算结果是否超 int。
(4)long long 类型输入(scanf)、输出(printf)是否是用了“%lld”。
(5)调试语句是否删除或屏蔽。
(6)分块是否有错。
(7)是否需要高精度。
(8)自己的输出结果是否和题目要求的一样,注意是一模一样,包括大小写!比如题目要求输出“Yes”而你写的是“yes”,那么你的程序就算错的!
(9)源代码存放的目录路径是否安装考试要求存放。
(10)是否交错文件,有没有自己错误的多建了文件夹。