OJ判错的n种原因

测试样例过了就是过了,oj判错是oj的问题.jpg

 

1.     WA(wrong answer)

a)      程序本身有问题,建议多测几组数据

b)      边界值,0,1或什么其他的时候特殊情况没有用if独立出来

c)       超过数据范围,最典型的就是递推的数据用int存,最直观的解决方案是打表输出每个结果,可以很轻松的发现哪里出了问题

d)      一组数据测试正确,后面出错,最典型的是没有清零数值,建议按我另一篇博客:良好的代码习惯改正自己的代码习惯

e)      最坑的可能是由于windows和linux系统的差异性导致的wa,如windows用\r\n换行而linux的换行是\n,做题看清楚判题系统使用的是什么系统环境,尽量保证代码的鲁棒性


2.     PE(presentation error) 修复起来较为简单

a)      输出时的%d应该是%4d

b)      每个数之间的空格

c)       行末有空格,可以把所有输出空格替换成“*”查看更方便

d)      每组之后输出空行\每组之间输出空行,这个还相对麻烦,每组之间可以在一开始立flag=1第一次将flag变为0,flag为0时输出空行(其他输出之前),这样适用性更广,对于给定组数的也可以对n的值进行判断。


3.     RE(runtime error)

a)      除以0

b)      数组越界(真的很常见,请在允许的范围内开大一点的数组,题目有时候限定的范围可能没有后台测试数据的范围大,吃过很多次亏了,而且检查每一步有没有可能出现负数下标或者下标大于n,编译器有可能不报错甚至运行都是正常的但是oj会算re)

c)       递归没出口或太长,尽量低估判题姬的能力,它的堆栈可能较小,所以以最优算法来解决问题,而不是以你自己的机器为标准(当然判题姬一般都很强)

d)      别搞一些什么system(“pause”)这种骚操作


4.     TLE(time limit exceeded)

a)      算法时间过长,以题目的最大范围值测试看又没有明显的超时现象,优化算法可能是最难的吧

b)      像while(1)这种循环是不是没有出口,注意多组不是说可以无限输入,而是输入到文件结束,如scanf的返回值为-1(EOF)时。注意有时候错误不太明显,如for(int i = 0; i <2; i++)i--;这种也是死循环


5.     OLE(output limit exceeded)  我认为本质上是wa,由于输出过多产生的错误


6.     CE(complie error)最简单的问题,编译出错

a)      一是提交的语言,如c不支持的struct内部变量初始化,用c++提交即可,个人推荐不要用c语言提交答案,c语言标准不一,也不知道会出什么奇奇怪怪的错误,c++向下支持c语言,所以直接c++就行

b)      二是编译器自带包装的函数,不要搞些骚操作


7.     MLE(memory limit exeeded)  emmmm…本人基本没有这种错误,不是作死一般不会有这个问题

你可能感兴趣的:(OJ判错的n种原因)