【新版·赛前必看】2020版信息学奥赛训练--错误集锦

欢迎同学们在下方发帖补充常见错误,互相督促,赛场不要出锅

致命错误——犯一条就零分

  • 未按题目要求添加文件读写

  • 未按题目要求输出结果

  • 忘写头文件

  • C++万能头文件写错

  • 主函数没有return 0

编译问题
  1. #include<cmath>/<algorithm>却使用abs()及lower_bound()函数;

  1. 少写头文件(如<cstdio>),或写错头文件(如<Cstring>,#include<bits\stdc++.h>);

  1. 注意abs()函数的使用,其支持的类型有限,不要使用labs(long int),;

  1. itoa()/_itoa()函数在C库中被取消定义,不能使用;

  1. 头文件与变量名x1,x2,y1,y2,y0冲突,编译错误;

  1. 以防变量名与系统函数名冲突,可以变量名去掉元音字母;

  1. 读入,输出却是print("%d")(可以通过开启“显示最多警告”加以解决),可加编译命令:-Wall -Wextra -Wl,--stack=536870912或者具体设置

  1. 看清楚编译命令,看是否开O2,是否开C++11,如果不开,不要使用C++11特性;

  1. 加了inline后的返回值因inline被高亮了,所以容易被忽略,如:

复制

inlineAbs(int x){return x<0?-x:x;}
低级错误
  1. 文件读写错误或注释掉,或"w""r"写反,或英文拼写错误,或".out"写成",out",".int", 以及文件读写的过程中"***.in","***.out",未写后缀名。 小tips:可以使用string类的加减操作(+".in", +".out")把freopen包装成一个函数使用,在主函数调用_open("文件名前缀")即可。)

  1. 输入数据中有n和m的,一定注意n和m的顺序(样例常常是相等的)

  1. 看清楚给定的是字符串还是整数;

  1. 写出正解,自己认为写错,没有调试直接交,编译错误。

  1. 输出大小写要注意,Yes,YES区别开。

  1. 在最后提交时,文件名粘贴复制时注意前后留存的空格。

  1. 建图千万不要手抖,图建错了后面算法再写也不会对。

  1. 调试信息、注释掉的语句正式提交前检查是否为最终版本。

  1. 存数字的变量没有赋初始值,快读写挂。

  1. 注意运算优先级问题,比如:!(a%b)和!a%b不等价,以及常错的位运算。

运行超时
  1. 循环条件中使用函数,导致时间复杂度退化,超时。

复制

char s[50000];for(int i=0;i<strlen(s);i++)*****;

这样写会造成超时。 改写为:

复制

int  len=strlen(s);for(int i=0;i<len;i++)*******;
  1. 读取数据量很大时使用cin,导致超时。

  1. bfs中多次入队,导致vector超过空间限制或者超时。

  1. 一些大数组能用int就不必用long long,后者会拖慢效率。

答案错误
  1. 存数字的变量没有赋初始值(windows会赋值为0,Linux随机赋值);

  1. 结构体内的函数定义的变量要初始化。

  1. 快读写挂,建议不熟悉的人用scanf;

  1. 对于常见的模,相加在范围,相乘在范围。(@所有人)

  1. 一定要用大数据检验是否数组越界、乘法算术溢出;

  1. 多组数据忘记清空数组;

  1. 中间步骤计算量大,没取模,中间结果爆int/long long

  1. 计算结果为负数,直接取模将出错,考虑加一个模数的倍数,保证其为正后再取模。(@所有人)

  1. ull与int或long long进行算术运算,结果出错;

  1. 两个double不能直接用==比较,需要相减取绝对值与eps(根据题目精度要求设置具体值,比如1e-8)

  1. 按位取反的时候先导0不会被考虑,用((1<<len)-1)-当前值

运行错误
  1. 数组开小,RE;数组开大,超过空间限制;

  1. 数组调用过程中越界,下标为负数或超过数组定义范围;

  1. 大数组定义要放在主函数外面(map),大数组不能开在函数内部,取模要注意过程性(频繁)不能只给结果取模。容易爆;

  1. 取模时注意模数可不可能为0,除零也会RE。

算法逻辑
  1. if()…if()… else…结构不等价于if()… else if()… else…结构,逻辑错误;

  1. 如果手写哈希难度不是太大,建议别开map,以上的数据容易被卡常;

  1. 最短路SPFA,入队要做入队标记,出队时要做清空标记;

  1. 使用某些数据结构时要check有没有在主函数内调用build()函数;

  1. 开数组时[maxn << 2]注意不要写成[maxn < 2](c++没有任何警告);

  1. 按位取反的时候需要先导0不取反,用((1<<len)-1)-当前值

  1. 写分块等算法时,注意区分每个变量代表当前块还是当前位置,最好避免在代码中将两种变量先后取同一变量名,如都用i变量进行遍历;

  1. tarjan求scc时每次搜到一个点要入模拟栈;

玄学错误
  1. 注意:要用你熟悉的语句去, fin >> f[i] >> g[i++] ; 在linux下是错误的,windows下也有类似问题: 如有函数 cal(i), 当cout << cal (3) << cal (5) <<endl;,其实是先调用 cal(5)。

  1. g[t++]=g[t-1]多次使用t有时会出错,改写为:t++; g[t]=g[t-1];

超过空间限制
  1. 数组一般不要定义在函数内部,定义数组时注意所占用空间,若使用vector注意不要一直添加元素

  1. 数组占用空间计算方法,以int数组为例,一个int数据类型占用4个字节(Byte),则二维数组int num[5000][5000]占用空间 ,如果题目给的空间限制为128MB,则可以考虑定义这么大的数组。

  • long long类型:8字节; float类型:4字节;double类型:8字节;char类型:1字节。

注意

  • 开O2对内存审查就更加严格,越界一个位置都要错,有同学const int N=1e7+5然后定义数组s[N/100],由于整除,实际上就刚好开了1e5。

  • 考试的时候,对比自己的输出和大样例输出时,用cmd的fc来判断,本身fc是不忽略行末空格的,用fc /W可以做到忽略行末空格(by 许星宇)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值