论写代码犯的经(sha)典(bi)错误
1.圈里最著名的错误,没有之一:不开见祖宗
写题的时候一定要看清数据范围,尤其是数学题,带乘法的数据结构题,矩阵题等等
int a = 2147483648,b = 2147483648;
int c = a + b;
//很好,你不崩谁崩呢,感谢你为你省其他学校贡献了一个省一
2.快读,,一起用
int main(){
char ch;
scanf("%c",&ch);
int n = read();
string s;
cin>>s;
}
//这样看起来好像没什么问题,毕竟快读是输入数的嘛,但是重点是,这三个东西绝对不能一起用,缓冲区不同,大概率是会崩的
3.使用输入,不过滤行末的回车
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i ++){
char ch;
int x;
scanf("%c%d",&c,&x);
//然后就可以做一些事情了,这样写好像没有没有什么问题,这不是很正常的图论题或者线段树之类的数据结构的写法吗,我一直这么写啊QWQ,However,它错了,如果行末是有回车这种东西的话,这个程序就崩了,ch就会用来读那个回车。当然如果数据是一大串就是不打换行的话,那完全可以这么写(逃)
}
}
//正确的写法
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++){
char ch;
int x;
ch = getchar();//过滤行末回车
scanf("%c%d",&c,&x);
}
}
4.写树剖题的时候,输入一个询问或者修改,直接把它的序号扔给函数
蒟蒻表示,因为这个原因,瞎JB调试了2个小时才发现,关键样例还很巧合的对了,写树剖的时候千万记得传序号的时候要传剖完以后的,不要以为过了样例就没问题了,样例的询问可能是不包含修改的那一条路径的QWQ。
5.做图论题的时候,无脑的打循环到。
关于这个问题,像我这么菜的人犯过多次了,输入边的时候或者输入询问的时候,一定要看好是哪个变量,比如,不单单是图论题,其他题循环的时候也要看清是哪个变量。
6.双重循环的时候把打成,把打成
这个问题,大家用惯了循环变量,很容易就随手打上,然后......就没有然后了。举个例子:
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; i++){
//看起来好像没有什么问题,在这里面做一些东西,然后你就很愉快崩了QWQ
}
}
//再比如
for(int i = 1; i <= n; i++){
for(int j = 1; i <= n; j++){
//好的,它又崩了
}
}
7.输入变量的时候顺序错误
这个真的是自闭,尤其是在代码写对的情况下,不管怎么改,它都会疯狂WA,如果碰上样例中的这两个变量是一样的数值,那你就会很愉快的过样例,然后很愉快的提交,然后,更愉快的爆零了QWQ,这个就不贴代码了,可以参考一下 洛谷P1313 计算系数
8.各种手滑
0分和大于等于0分的区别,
//这个问题已经是所有OIer心中永远的痛了QWQ,就不多赘述了,直接贴几个很正常的代码吧
//1.
for(int k = 1; k <= n ; k++){//floyd板子,WA自动机
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
dis[i][j] = min(dis[i][j],dis[i][k]+dis[i][j]);
}
}
}
//2.
for(int i = 1; i <= n; i++){//建树,好像没有什么问题,又一个WA自动机
int x = read();
int y = read();
add(x,y),add(y,x);
}
//3.一个很正常的判断偶数的代码,YES自动机QWQ
if(n%2=0) printf("YES");
else printf("NO");
//插一句,位运算它是真的香啊
if(!(n&1)) printf("YES");
else printf("NO");
//4.
int main(){
int a = read(),b = read();
cout<<a+b<<" "<<a-b;
//这个代码好像真的没有问题啊,就两行我怎么会看不出错呢QWQ,由于考试使用的是逐行比较,而不是人工比较(滑稽),所以一个小小的空格可能就是爆零的原因
}
//如果大佬觉得这些问题一眼就看出来的,那么想象一下把上面的代码扔到一个大模拟或者数据结构题里QWQ
//还有其他的情况,欢迎各位大佬补充QWQ
9.读题不仔细QWQ
既然上面提到了YES和NO,我们就以这个为例看一道毒瘤题吧,洛谷P3385 负环,:“这不是一道垃圾题吗,SPFA搞一下不就好了,。”然而我一开始也是这么想的,敲完以后果断提交,然后就得到了0分的好成绩。为什么呢?请大佬们注意一下输出格式。输出“YE5”或者“N0”。QWQ果断骂出题人毒瘤吧,
10.关于memset
//这是又一个悲伤的故事
memset(a,0,sizeof(0));
//还有就是这样的
memset(a,1,sizeof(a));
//memset是个字符串函数,它会按位初始化,只能用来初始化0的,上面那行代码会把数组每一个元素的每一位都赋成1,然后,就死了QWQ
//正确的写法:有种东西叫fill,它在<algorithm>里
fill(a,a+n,1);
//或者,for循环搞一下QWQ
以上是打题的过程中会出现的经(sha)典(bi)问题,接下来是考场上大神们的神仙操作了
1.不开文件QWQ
//打开一份爆零的代码,你看到的可能是。。。这样的
int main(){
freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
fclose(stdin);
fclose(stdout);
}
//还有可能是这样的
int main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
fclose(stdin);
fclose(stdout);
}
//还有可能是,,这样的,~~手动滑稽~~
int main(){
srand(time(NULL));
cout<<rand()%MOD;
}
2.文件名错误
那种手滑敲错文件名的情况,这里就不讨论了,我们讨论一种更为自闭的情况,那就是不开拓展名,然后,交上了一个形如a.cpp.cpp的代码。
3.CE
因为CSP是在Linux系统下评测的,所以以下常用的变量,是与Linux的关键字冲突的,Windows下没有问题,一旦交上就会得到爆零的好成绩
int time,left,right,end;
//所以正解是
int QWQ_time,QWQ_left,QWQ_right,QWQ_end;
//这样怎么可能出错呢
还有一种CE,
#include<queue>
priority_queue <pair<int,int>> q;
//好像没什么问题(这句话已经不知道打了多少遍了),已经开了queue的库了啊,怎么会CE呢。
//正确的写法:
priority_queue <pair<int,int> > q;
//这就是又一个0分和大于等于0分的差别
因为CE的情况实在太多了,至于其他的CE
所以一个又一个悲伤的故事告诉我们,考试结束前的10分钟甚至20分钟,一定要把源代码重新编译一遍
4.没有删掉调试信息
//重灾区,犯过的童鞋举个爪
int main(){
int a = read(),b = read();
cout<<a<<" "<<b<<endl;//检查快读写的对不对,嗯,很好,它对了,下一题QWQ
cout<<a+b;
}
//然后,你又为其他学校贡献了一个省一
//当然还有各种其他的调试信息,比如某些大佬递归爆栈的时候,习惯每递归一次就输出一下,然后因为太强了,马上就调对了,然后就去切下一题了,然后,,就没有然后了
void dfs(int x){
cout<<"@"<<x<<endl;
if(x==n+1){
return;
}
dfs(x+1);
}
所以又是一个有一个悲伤的故事告诉我们,考试结束前一定要把样例重新试一遍,而且要开文件试
5.文件路径存错
这个问题,有一个很直接的解决方案,你可以把监考老师请过来给你检查文件路径,相信他是不会拒绝的。