考前:
考试前把读入优化和库以及对拍文件打好做好准备工作,另外注意放松心态,太紧张了肯定考不好··将自己的注意力集中起来
考场策略:
考试的基本策略是对每于道题先想个20分钟,如果想不出个靠谱的方法就把赶紧暴力打了一定要打暴力,想不出正解要打暴力,想出了正解对拍也要打暴力,而且把暴力打了之后心里都踏实得多··起码保底了,打完后再想正解.
题目思考:
先要确定大体方向:模拟(往往只有第一题),策略(贪心等),数学,数据结构,图论,dp,字符串,树,二分,三分,搜索,(多半会加上剪枝折半记搜或者迭代加深)
合理利用并查集,哈希,倍增,差分,链表,优先队列,桶,单调队列,单调栈等辅助算法
充分利用题目给的数据范围考虑可能用到的算法,毕竟n^2,nlogn,nlogn^2,n还是比较好判断的
不要一看到数据结构就往线段树上面想,可能会没有那么麻烦
dp的时候多想想平时自己用到的套路,如最大子串和,最长不下降序列,最长公共子序列,各种背包问题,树形dp考虑求树的直径,重儿子,最大次大值等,区间dp的枚举断点,另外复杂度如果不对要考虑dp优化(滚动数组或者决策单调性),有时也会用数据结构优化dp
图论的话一般在比较简单的情况下只会考最短路和最小(大)生成树,和拓扑排序,tarjan求强连通分量边双连通割点,但图论题比较难的一点是通过条件间的逻辑关系转化成图论题,这时除了上述算法以外常常会用匈牙利差分约束等算法解决
字符串本身算法很少,只有kmp,哈希,trie,ac自动机,manecher,因此有时它会和其他算法一起考,如dp;
想题的时候思维要灵活点··如果往一个方向想一直没进展的话就要考虑放弃了
有时候想不出正解时可能暴力就是正确的,自己在计算复杂度时可能考虑了许多多余的情况(所以要一定打暴力啊)
鉴于在NOIP考场上它算法可能不会考多难··但肯定会用思维难度来弥补,如果可以适当地用NOI的一些算法来降低思维难度的话可以考虑考虑
代码编辑:
打代码时一定要集中精神,不然很容易出错··如果打完代码后还是调试半天找出很多错误说明打代码时肯定没认真···
打代码前要想想这道题是否有什么边界条件还没有考虑.分类讨论是否全面,有时因为一个边界条件可能就错完了,打代码时也要好好考虑,比如mod的时候如果是负数要加起来,用到除法的时候除数是否考虑了0,是否需要判断无解情况,有没有可能访问了非法的位置(爆数组或者访问了负的位置,用桶的时候尤其注意),有没有可能爆int,有没有可能double写成了整数型
注意自己的算法是否爆空间,用cout<<sizeof()/1024/1024判断判断
尽量保证自己代码的简洁度,能不分类讨论就不要分类讨论(当然是在保证正确性的情况下),有时如果要判断某些边界情况很麻烦的话可以在边界加上不影响答案的元素,比如在splay的题中我们常常在里面放一个-inf和一个inf··平时就要多参考其他人写的比较优美简洁的代码··不然调试的时候可能会晕
合理使用stl中的文件,如vector,queue(queue,deque,priority_queue),set,map(这玩意儿有点不靠谱··能手打hash表还是手打吧)
如果变量很多的话变量名就打长一点,好辨别···实在不行打拼音··
打代码时注意自己是否用到了非法的变量名,像y1,x1,next,index啥的一定要注意··如果平时用这些变量名用习惯了的话可以在第一行打一个”改变量名“,这样的话编译的时候能提醒自己
打完后可以加个register提高代码速度,(有可能会re,加完后运行程序看一看)
看看是否用到了O2优化,用了的话用自己编辑器开O2跑一跑程序
考后检查:
考完后重点再次检查上述的错误,数组开小没?是否需要开int?是否需要开double?是否需要改变量名?是否需要考虑边界?
最后好好检查文件输出输入,错了就完了··