论写代码犯的经(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.文件路径存错

这个问题,有一个很直接的解决方案,你可以把监考老师请过来给你检查文件路径,相信他是不会拒绝的。

好了以上就是本菜鸡整理的经(sha)典(bi)问题,欢迎各位大佬补充

01-07 10:25
查看更多