很久以前就想专门写篇有关oj原理的博客了
因为之前对电脑判题的原理有过质疑
于是在极长的一段时间内妄想在网络上找到相关的解答
后来在问老师问同学问博主问度娘一点一点解惑
慢慢总结后
大致覆盖了我目前的一些疑惑
1)首先是有关在线评测系统运行原理及各种报错常因
其实不难想象,电脑只是处理数据验证最后答案与期望答案是否相同,大部分的思考都由人来完成
oj一般有一组input文件和一组output文件,
先运行你的程序,同时在后台开始计时,
无法通过编译的是CE,
编译时开的内存过大时MLE,然后开始运行,
将所有input数据加入输入流中(数据量可能很大,几百万组什么的)
在这种大数据下除非你的程序是完美的,否则不可能通过。
将输出的内容和output文件比对,
不完全一样的WA,
数据一样当差换行和空格时是PE,
若在计时器计时结束前你的程序未能和output匹配完成(已完成部分都正确)是TLE,
输出流没有正常结束是OLE,
运行时调用了非法地址时是RE,
在正式比赛中input包括两部分,
一部分是出题人这对这道题可能的算法出的边缘数据,运算量最大的数据,特殊数据,
另一部分是大数据,就是随机生成大量的合法数据,将数据通过标程给出结果。
这两部分数据结合可以以极高的准确率判定提交的程序是否正确
在正式比赛中依然有裁判组,
他们只对ac率和预先估计相差极大的情况进行观察,
必要时重写oj,进行rejudge,
同时选手也可以申请裁判关注(裁判只对真正误判的情况回应),
你所想的由专家手动判题的情况是不存在的。
因为判题必须在极短时间完成。
但是好多网络赛中及时向出题人反映的情况却不少见
仅仅是通过了样例的程序远远不能ac,
样例只是帮助你理解题意而已,
通常样例无法检测出程序的错误。
甚至有些样例是有误导性质的,
要走的路还很远
acm的题意描述通常是很严谨的,
在题意允许的范围的数据都可能出现,
特殊情况很多题目里还没说如何处理的情况几乎不存在。
题没过检查一下,看看disguss,
看看别人的解题报告什么的,有些东西做多了就理解了,