#P0001. 提交评测与错误自查(From Luogu)

提交评测与错误自查(From Luogu)

请注意:这不是一道题。 在程序设计竞赛中,选手按照要求编写完程序后需要自己进行测试,以保证程序符合题目要求,然后统一提交并进行评测。本书的编程例题大多也是符合这样的格式。读者可以去各个在线题库(即 Online Judge,例如洛谷)找到更多的题目并提交自己的代码让评测系统进行编译运行和评分。

出题人会生成多组测试数据,向选手编写的程序编译后的可执行文件输入,将得到的选手输出和标准输出进行比对;如果选手输出和标准输出一致(或者通过特殊判断认为选手输出是合法的)就能够获得这部分的分数。如果出现输出错误答案或者运行时间过久、运行时错误等问题,则不能得分。

评测结果会出现以下常见的情况。

  1. Waiting / Judging / Pending / In queue:程序正在等待评测,或者正在评测。
  2. Accepted(AC):程序通过了测试点。
  3. Compile Error(CE):程序编译错误。
  4. Wrong Answer(WA):错误的答案。
  5. Runtime Error(RE):运行时错误。
  6. Time Limit Exceeded(TLE):超出时间限制。
  7. Memory Limit Exceeded(MLE):超出内存限制。 如果有一个或者多个测试点没有通过测试,那么就无法获得该题的AC,经常可能因为一点微小的错误就造成程序错误。练习时未能通过题目是常见情况,不用惊慌,找到错误改正即可。

如果没有通过题目,可以通过下列方式来尝试自查更正。

情形1:编译错误

选手在本地成功编译好程序,并能够运行,方可提交到在线题库上进行评测。如果程序连运行都实现不了,那么大概就是编译错误。

使用各种IDE 编写程序时,如果程序存在语法错误,那么会产生编译错误,尤其是在初学阶段。编译器会定位到出错的地方并给出出错的原因(用英语写的)。尝试去阅读编译错误信息并进行更正。常见的错误包括使用了全角符号,漏写分号或括号,没有提前定义变量,等等。如果无法根据信息找到编译错误的原因,也可以去寻求老师、其他同学甚至网友的帮助。

情形2:错误的答案

如果选手的程序和标准输出的答案不一致,那么会返回错误的答案。程序在提交评测前,应当先在自己的计算机上输入样例,如果程序给出的结果和输出样例不一致,那么程序肯定有问题。

首先必须确保算法本身是正确的;如果算法不对,写得越多则错的越离谱。如果不确定算法是否正确,不妨看看其他同学写的文字版的思路(而不是代码)。如果算法错了,就要重新写了。

算法是正确的但还是不能过样例,可以使用“输出中间变量”的技巧来辅助查错。这其实很简单,在程序的中间插入很多输出语句,把这个位置的变量的结果全部输出,然后通过人脑计算这些变量本应当是什么。当手工计算的变量结果和输出的变量结果不一致时,输出变量语句的前面的某些语句就不正确。

仔细检查这些语句,可能是变量录入错、运算符录入错、选择错了数据类型,或者是少写了一些步骤。改正这些错误再尝试运行一次,提交时不要忘记删除这些多余的输出。

有时候测试样例比较刁钻,可能会出现一些选手没有考虑到的情况。在洛谷中很多基础题目都会提供测试数据下载,可以下载这些数据看看有没有陷阱,也可以使用刚才提到的输出中间变量法来进行调试。需要注意的是,编写程序时尽可能养成全面思考的习惯,不要过于依赖测试数据进行调试。

情形3:超过时间限制

接下来的内容读者目前还不会遇到,但是以后碰到这些问题却是家常便饭。因此,如果遇到了这样的情况,记得回来翻阅这里的内容。

最常见的超时原因是虽然算法给出的结果是正确的,但算法复杂度不够优,以至于需要进行特别多的运行次数才能正确解出。这种情况下还是可以去看看题解,学学新算法,然后重新改进思路。

除此之外,新手也经常遇到因为死循环而超时的问题。这里同样可以使用输出中间变量的方法来调试。如果运行程序,发现某条语句无限输出,那么这条语句所在的循环就可能是死循环(无法跳出的循环)。尝试检查这个循环的错误,比如循环变量有没有正常变更,有没有用错循环变量,等等。 在某些在线判题系统中,没有全部读入完输入数据也可能造成超时,但是在QluOJ不会出现这样的情况。

情形4:运行时错误

最常出现的运行时错误的原因是数组越界,虽然有时候数组越界不会引发运行时错误而只是会影响后面定义的变量。被零除等非法操作也会导致运行时错误。如果某些评测机没有设定足够大的栈空间,那么栈空间溢出也会造成 RE。

需要注意的是,在主程序最后return一个非零的数字也会造成评测机认为RE。

情形5:超出内存限制

最有可能的原因是因为估计错误而开了非常大的数组。此外,还有可能是中请了过多的动态空间、STL容器存储了过多内容等原因。

总而言之,请读者注意:

解决问题的前提是发现问题,所以找到那条语句出错才是更正程序的关键所在。出现错误、发现错误、改正错误是正常的流程。读者应当在练习的时候,记录下自己犯过并已解决的错误,并且以后尽可能不犯同样的错误。

如果你看完之后,希望AC本题,那么输出一行字符串I Love Algorithm.即可。