NOIP2015的复赛即将到来,在此整理一些注意事项,以防止出错。
【常用头文件】
常用的头文件有很多,可以在考试前先预先打好,然后再一次性复制粘贴到程序里面。
/*C 标准头文件*/
# include //memset(),strcmp()等函数,必须记得
# include //rand(),atoi()之类的函数,C标准的函数库
# include //一些int之类的系统类型的最大最小值
# include //标准输入输出,注意scanf()和printf()比较快
# include //转换大小写之类的小功能,和字符相关
# include //C语言的一个非常重要的数学库,sqrt(),floor()之类的都在里面
/*C++ 标准头文件*/
# include //C++的输入输出流,long long类型建议使用,但效率慢
# include //C++的文件流,比freopen()+scanf()慢很多
# include //C++的字符串就定义在其中,非常常用
/*STL 函数库*/
# include //STL最神奇的算法库,什么sort(),unique()之类的都在里面
# include //按位存储的set,相当于set,但是更加高效
# include //vecotr动态数组,有时可以用来骗分,接近数组
# include //STL的栈,使用比较方便
# include //STL的FIFO队列和优先队列
# include //双端队列,适用于两端插入的情况,也可以随机访问
# include //链表,但是常数比较大,要小心使用
# include
【不同平台的一些兼容性问题】
考试使用的机器是Windows系统,但是最终评测使用的是Linux系统,所以GCC的标准不一样。这就会带出许多的兼容性的问题。首先,Windows下结构体内的数组会一般来说初始为0,但是Linux下好像包括全局变量都不会初始化,所以必须写明了来初始化。其次,在Windows下scanf读入long long int 类型时要用%I64d,但是Linux下却不一样,是%lld,所以这是一个必须注意的问题,所以如果数据量较小可以用cin/cout来读入,这样兼容性更强。还有,Windows下在程序的最后可以不用打return 0;,但是Linux下就必须打,不然就会0分。像这样的问题似乎还很多,都是要引起高度重视的点。还有全局变量要慎用,在一些特殊的量前面可以加下划线。
【可能考点】
NOIP的基本难度分布是这样的:
第一题:肯定是水题,基本上不难想到解法,一般来说模拟即可
第二题:可能会用到一些基础算法,比如贪心,枚举,搜索之类,很入门
第三题:从第三道题开始就会难很多,会逐渐考到二分、动态规划之类的算法,应该会相对难不少
第四题:最后一道题绝对是压轴题,要么是剪枝的搜索,要么是动态规划,甚至还有状压DP、树形DP之类的,可能会考到树和图。
所以有必要复习一些相对来说重要的算法:
1.高精度
高精度是一个非常非常重要的算法!高精度一般来说会用在递推、动态规划求方案数,以及组合数学直接计算的方面。一定要熟悉高精度的加减乘,除法至少也要记住原理,求余就比较少见了。
2.模拟
这是非常基础的内容,但是有可能出很难的题目,比如08年的立体图,一定要注意审清题目,弄懂题意。
3.贪心
贪心是一种比较重要的算法,在关键时刻可以做出一些避免超时的决策,在比如说搜索、动规时也可以起到相对重要的作用,大大减少状态数,比如守望者的逃离一题,直接动规就会爆内存+超时,用贪心可以使状态数快速锐减。
4.动态规划
动态规划、贪心都是和子问题相关的,动态规划的基本思想是将一个大的问题划分成子问题,接着分别求解,而且能够将一些重复的计算记忆化,大大提高效率。
5.搜索与枚举
搜索和枚举在本质上都是相同的,一般来说用在数据范围较小的题目中,而且比较容易写。当然在能够观察到有着非常多的重复计算时可以使用记忆化搜索,不过使用了记忆化之后DP方程通常也不难求出,但是记忆化搜索比较好写,和搜索很想,考虑到NOIP的弱数据,和动规也都差不多。
6.二分答案
二分答案在实质上是一种枚举的优化,一般采用迭代的写法,但是有的时候也用递归,因为要递归的层数一般很少。二分答案一般适用于当所要求的答案递增时可用,时间复杂度一般来说都是O(log2n)。
7.计数
计数这一技巧可以在数据的规模较小,而对时间复杂度的要求很低时可用,基于计数排序或者哈希表的原理,这个技巧可以在近似O(1)的时间内找到数据。
8.数论
NOIP并不考太过难的题目,比如欧拉函数
φ
(n)之类的东西,一般来说只会考与质数相关的基本数论,并不会太难,就算是指数筛选也鲜有用O(n)算法的,质数判定之类的问题更是一个O(sqrt(n))的算法就能搞定,一般都出在第一到二题,或者说也就是一些非主要考点罢了。
9.树与图
树与图其实是一个很难的概念,在省赛里几乎是家常便饭,但是NOIP之前并没有考多少,一般来说记住SPFA和Floyed就足够了,还有最小生成树(好像最小树形图都不考),拓扑排序和强联通分量之类的东西,一般来说连像并查集这样的东西都没有考到,更何况像动态树、平衡树、线段树这样的东西?
10.字符串相关操作
字符串的操作有的时候还是比较烦的,比如说洛谷11月月赛的第一题,我用了半个小时才写出一个程序来。一般来说都是用到一些字符串的基本函数,还有可能会用到的O(m+n)的哈希和KMP之类的算法。
11.数据结构
数据结构一类,无非就是队列、栈、邻接矩阵之类的东西,高级一点也无非是单调队列、哈希表、并查集,树状数组和线段树就绝对不会考了。其实还是挺简单的,只要细心一点观察题目,不难解决。