算法竞赛:Online Judge 工作原理 常见报错分析 如何判断算法是否超时 知己知彼 方能骗分

一、在线评测系统运行原理及各种报错常见原因

电脑只是处理数据验证最后答案与期望答案是否相同,大部分的思考都由人来完成。

OJ一般有一组或者多组input文件与output文件,比如1.in 1.out 2.in 2.out等

OJ先运行你的程序,同时在后台开始计时,要求在1秒钟内通过一个测试点。

无法通过编译 CE

编译时开的内存过大 MLE

然后开始运行,

将所有input数据加入输入流中(数据量可能很大,多则几万组)

在这种大数据下除非你的程序是完美的,否则不可能通过。

将输出的内容和output文件比对,

不完全一样的WA

数据一样,差换行和空格时是 PE

若在计时器计时结束前你的程序未能和output匹配完成(已完成部分都正确)是 TLE

输出流没有正常结束是 OLE

运行时调用了非法地址时是 RE

二、在正式比赛中input包括两部分

一部分是出题人这对这道题可能的算法出的边缘数据,运算量最大的数据,特殊数据,

另一部分是大数据,就是随机生成大量的合法数据,将数据通过标程给出结果。

这两部分数据结合可以以极高的准确率判定提交的程序是否正确

有关ac样例的问题

仅仅是通过了样例的程序远远不能AC,

样例只是帮助你理解题意而已,

通常样例无法检测出程序的错误。

甚至有些样例是有误导性质的,

样例不能测出程序是否超时,

不能解决特判的情况,通常是 0 1 这样的特殊数字

总结:

学生提交代码后,OJ系统会对代码进行编译,如果编译通过,那么会将各个测试点的数据作为输入,程序运行后读取数据并进行输出。系统会对程序的输出和正确答案进行比较,对输出结果进行判定。一个题目有多个测试点,会将程序运行数次。

  程序运行过程中也有可能会因为各种各样的问题而导致程序异常终止,系统会对这些问题进行判定。

三 、测试点的检测结果示例

 C++还会有个 开启O2 优化 的选项,-O2指的是编译器的优化级别(Optimization level),还会有-O1, -O2, -O3, -Os, -Ofast等。

  编译器的优化选项默认是-O0,即只进行必要的优化而不做其它的优化处理,一般是作为调试使用。

  开启-O2优化后,编译器会花费更多的时间来编译,以提高代码性能,甚至部分代码的计算结果在编译器就已经计算出来。开启优化会使得运行时间大大减少,开启和不开启的运行时间有时会有数倍的差距。(有些算法竞赛中是禁用优化O2)

  C++ 标准模板库(STL) 中的通用型模板,能解决大多数情况的问题,使用时可以大大减少代码量和测试工作量。

  STL本身性能也是很高的,手写的对应算法,性能上超过STL是很困难的。但STL如果不经过优化的话,性能会低很多,开启O2级别以上的优化后,STL性能就大大提高。 常用的STL模板一定熟练使用。

四、如何判断算法是否超时

一般评测机一秒最多可以运行 一亿次 即 10^8次。而一般编程竞赛都会将时间限制为 1000ms 即 1s。在这种情况下,C++ 代码的操作次数控制在 10e7~10e8为最佳。

1000ms意味着

O(n3)的算法,可以几百,一般题目给的数据范围为100。

O(n2)的算法,可以几千,一般不到万,经常出现的就是数据范围1000。

O(nlongn)或者O(n)的算法,最常见的数据范围就是为100000。

下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:

相关推荐
2603_965148112 小时前
家居百货蓝海:API挖掘高复购率生活小商品
大数据·服务器·人工智能·python·生活
上学的小垃圾5 小时前
基于docker安装MySQL(openEuler系统)
linux·mysql·docker·容器
阿童木写作5 小时前
跨境电商图片翻译工具推荐:批量图片翻译+视频字幕翻译+智能抠图
python·macos·音视频·xcode
cui_ruicheng6 小时前
LangChain 应用开发(十四):Agent 上下文与记忆机制
服务器·人工智能·python·langchain
circuitsosk6 小时前
任务规划器的三种范式对比:ReAct、Plan-and-Execute 与 Tree-of-Thought 在真实业务中的取舍
前端·javascript·python·react.js·llm·ai agent
shehuiyuelaiyuehao6 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
一直C6 小时前
Linux网络编程|HTTP协议详解(报文、请求方法、状态码)
linux·http·wireshark·vim·visual studio
宸津-代码粉碎机7 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
测试19987 小时前
如何用appium搭建Android自动化测试框架?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
程序员大雄学编程7 小时前
微积分46. 无穷级数四大核心性质:从理论到实践的全方位解析
python·学习·微积分·学习工具