算法竞赛:Online Judge介绍

专栏:算法竞赛

上一篇:

下一篇:

文章目录

  • 一、什么是Online Judge
  • 二、Online Judge 网站
    • 1. 洛谷
    • 2. LeetCode 力扣
    • 3. 牛客
    • 4. PTA 拼题A
  • 三、算法竞赛题目
    • 1. 题目描述
    • 2. 输入输出样例
    • 3. 程序限制
    • 4. 评测状态
    • 5. 评测环境
      • 5.1 语言标准 及 编译器(解释器)版本
      • 5.2 优化选项

一、什么是Online Judge

Online Judge指的是在线评测系统,简称 OJ,是一种用来测试算法程序正确性的在线系统。

  Online Judge 多用在编程竞赛和编程练习中,用户可以通过提交自己的代码,让系统帮助测试程序是否能根据输入输出正确的结果,从而达到检验程序的正确性、空间和时间消耗程度的目的。

  OJ系统能够编译并执行代码,使用预设的数据对这些程序进行测试。提交的代码一般会在受限的环境下运行,包括时间限制、内存限制、安全限制等。代码的输出会被OJ系统捕获,与标准答案进行比较后返回结果。

二、Online Judge 网站

  OJ 网站 除了有在线评测功能外,还会有大量的题库,给用户进行编程练习。大多数OJ网站还会对统计用户的得分,对用户进行排名。

算法竞赛:Online Judge介绍_第1张图片

  一些比较友好的OJ网站还会搭建代码编辑器,提供自测功能,以及设立算法编程社区来方便用户对问题交流讨论等等,这种OJ网站提供的算法编程环境就更适合新手的成长。

算法竞赛:Online Judge介绍_第2张图片

  目前的OJ网站一般分为两类,一种是偏向于算法竞赛的,收录各种编程竞赛的题目,而另一种是偏向于求职面试,收录各公司的编程笔试题目,如LeetCode,牛客网等。

  OJ是个人进行算法编程训练必不可少的工具,很多高校都有自己的OJ网站,如北京大学的 POJ,浙江大学的 ZOJ 等,高校创建的OJ以竞赛学习为主,所以题目会具有一定的深度,并且收录有不少经典题目,算法学习到已经程序后,可以到这些高校创建的网站刷刷题。当然,因为是学校创建的网站,并非是属于商业用途,所以网站体验不是很好,崩溃是常事,网站UI和代码编辑体验也做得不是很好。

  下面推荐几个体验较好、比较适合入门学习的算法竞赛编程网站。当入门到一定程序后,也可以网上自行搜索其它人推荐的适合自己的编程网站。

1. 洛谷

https://www.luogu.com.cn/

  洛谷网从 2013年开始运营,为广大算法竞赛选手、程序设计爱好者以及院校企业机构提供算法题库、社区、训练工具、在线教育为一体的解决方案。
  洛谷偏于算法竞赛,编程环境和社区维护得较好,较为适合新手入门学习。

算法竞赛:Online Judge介绍_第3张图片

2. LeetCode 力扣

LeetCode
力扣(LeetCode中文网站)

  LeetCode是著名的算法编程网站,内容偏向于求职面试。从主页的内容就可以看出富含招聘的气息。LeetCode刷题也是提升求职成功率有效方式之一。
  LeetCode中有许多分类好的编程面试题目清单,题库中也有上千道题目。
算法竞赛:Online Judge介绍_第4张图片
算法竞赛:Online Judge介绍_第5张图片

3. 牛客

牛客

  牛客是编程学习和求职面试网站,里面有着众多招聘信息和校招社招交流圈,面试题目众多。题库不仅包含算法题目,还有些编程基础题目,面试问题等。代码编辑环境也做得挺好。
算法竞赛:Online Judge介绍_第6张图片
算法竞赛:Online Judge介绍_第7张图片

4. PTA 拼题A

https://pintia.cn/

  拼题A”(https://pintia.cn) 是浙江大学国家级程序设计系列课程教学团队与网易公司、杭州百腾教育科技有限公司合作,于2015年9月推出面向高校和社会的程序自动评测、开放式的教学辅助平台。 系统创建之初,全称为“程序设计类教学辅助教学平台”(Programming Teaching Assistant,亦简称 PTA)。
  作为教学辅助平台,上面可以进行作业、测验、考试、竞赛等教学活动。
算法竞赛:Online Judge介绍_第8张图片

三、算法竞赛题目

这里以洛谷入门第一题 A+B Problem 为例
题目原地址 https://www.luogu.com.cn/problem/P1001

  各个OJ网站首先会出一道非常简单的题目来给用户进行测试,熟悉一下界面的操作流程,比如 要求输出Hello World,要求输出两个数的和等。
  题目还会分难度、分题型等,用户可以根据自身情况选择去做。

1. 题目描述

  题目描述负责说明题目和要求,并且说明数据的范围以及输出要求
算法竞赛:Online Judge介绍_第9张图片

2. 输入输出样例

  这里会说明输入输出的格式,以及给出一个或多个输入输出的样例,方面用户进行理解以及进行自我验证。这里需要注意,通过了样例的输入并不意味着程序就是正确的,在样例中给出的输入往往是最普通的值,而在实际评测时,会测试多个输入来检验程序,输入的数据十分刁钻,包含各种分类值,边界值。
算法竞赛:Online Judge介绍_第10张图片

3. 程序限制

  计算机资源并非无限,所以需要算法所使用的内存限制在一定范围内,运行时间不能超出时间限制,毕竟如果超出了时间限制,那可能是算法复杂度较高,不是一个较好的算法。
  不同的题目和不同的OJ网站,所做出的限制并不是完全一样的。

  • 时间限制可能会根据题目所使用的算法本身复杂度和编程语言进行调整,通常是1秒或2秒。
  • 各网站设置的内存限制大多是32MB,64MB和128MB左右。

在这里插入图片描述
在这里插入图片描述
算法竞赛:Online Judge介绍_第11张图片

4. 评测状态

  提交代码后,系统会对代码进行编译,如果编译通过,那么会将各个测试点的数据作为输入,程序运行后读取数据并进行输出。系统会对程序的输出和正确答案进行比较,对输出结果进行判定。一个题目有多个测试点,会将程序运行数次。
  程序运行过程中也有可能会因为各种各样的问题而导致程序异常终止,系统会对这些问题进行判定。

状态 全称 含义 可能的原因
AC Accepted 程序通过 有问题吗?没有问题!
PE Presentation Error 格式错误 距离成功最近的一种,仅仅是输出答案的排版不正确,没有换行、插入了多余的空格等。
CE Compile Error 编译错误 代码没有通过编译,可能是语法问题、链接错误、找不到头文件等。
WA Wrong Answer 答案错误 答案与给定的不符,可能是计算错误、算法错误等输出了错误内容,或者有多余输出。
RE Runtime Error 运行时错误 运行过程中出现的一些导致程序异常终止的问题,如段错误、除0异常、栈溢出等,属于程序本身的问题。
TLE Time Limit Exceeded 超出时间限制 运行时间超出了题目规定的时间上限,可能是程序死循环或者算法复杂度过高。
MLE Memory Limit Exceeded 超出内存限制 使用的内存超出了题目规定的上限,可能是空间复杂度过高。
OLE Output Limit Exceeded 输出超过限制 答案输出过长,可能是出现了死循环,或者循环次数过多等问题。
UKE Unknown Error 未知错误 系统因其它原因造成的错误。
PC Partially Correct 部分正确 输出的结果中有部分是错误的。某些评测系统会有这个评测状态。

测试点的检测结果示例

算法竞赛:Online Judge介绍_第12张图片

5. 评测环境

洛谷评测机语言环境说明

  编程不可忽略的一个就是语言环境。编程语言随时代发展,会不断进行修改,添加新的语法和特性、标准库新功能,弃用旧功能等。
  在这个过程中,编程语言会设立一个个语言标准,以促进语言标准化,规范编译器和解释器的行为。新标准中的新语法,在旧版本的编译器(或解释器)中将无法被识别,而新标准大多兼容旧标准中的语法,旧标准中的语法在新标准中仍适用,也有少部分函数或功能被弃用。有时也会出现新语法标准不兼容旧标准的情况,造成断层,如 Python3.0Python2.7,这种情况下如果想使用新版本,就需要将旧项目中的代码进行升级。

算法竞赛常用编程语言
标准(版本)
详细
C C90, C99, C11, C17 等多个标准,以及即将到来的 C2x 标准   目前大学课程大多仍使用 C90 标准,工业则部分推进到了 C99C11
C++ C++98, C++11, C++14, C++17, C++20 等多个标准,以及即将到来的 C++23   目前大学课程大多仍使用 C90 标准,部分使用 C++11, C++14C++17。工业则部分推进到C++11C++14,有些仍使用C++98
Java 发布了Java 1.0~Java 1.9, Java 10 ~ Java 16版本(从 Java1.10 开始,称为 Java10,后续为了命名规范,又将 Java 1.5 至 Java 1.9 改为 Java 5 ~ Java 9) 大学课程大多使用 Java 1.4 ~ Java 1.8 版本,工业界则大多使用 Java 8 版本
Python 主要分割为 Python2.xPython3.x 两种版本,Python3.x不兼容Python2.xPython3.x 目前已发布至 Python3.10 版本   已经推进到Python3.xPython2.x 存在于小部分旧项目 和 课程中。

5.1 语言标准 及 编译器(解释器)版本

  不仅是不同的编译器(解释器)版本所使用的语法标准不同,而且对于同一个语言标准,不同的编译器开发商对于标准的支持度也并不一样,甚至实现还有可能不同,并且还有各自的扩展语法,所以实际使用时还需了解所使用的编译器。

  下面是洛谷所列出的评测机语言环境:
算法竞赛:Online Judge介绍_第13张图片

5.2 优化选项

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

  编译器的优化选项默认是-O0,即只进行必要的优化而不做其它的优化处理,一般是作为调试使用。
在这里插入图片描述
  开启-O2优化后,编译器会花费更多的时间来编译,以提高代码性能,甚至部分代码的计算结果在编译器就已经计算出来。开启优化会使得运行时间大大减少,开启和不开启的运行时间有时会有数倍的差距。(有些算法竞赛中是禁用优化O2)

  C++ 标准模板库(STL) 中的通用型模板,能解决大多数情况的问题,使用时可以大大减少代码量和测试工作量。
  STL本身性能也是很高的,手写的对应算法,性能上超过STL是很困难的。但STL如果不经过优化的话,性能会低很多,开启O2级别以上的优化后,STL性能就大大提高。

  虽然优化可能会大幅减少运行时间,但有时不一定是好事,因为有些代码使用了 未定义行为(undefined behavior),或者其它情况导致的编译器对此做出的条件假设可能不符合写代码的人的初衷,优化后可能会造成结果错误。出现这种问题大多是代码本身的问题。

  程序作为软件产品发布时,则必须开启优化,不能以Debug模式来编译发布,因为Debug模式为了方便调试,不做优化,并且编译结果会包含调试信息。与Release模式编译出来的执行文件相比,速度可能会慢几十倍。


专栏:算法竞赛

上一篇:

下一篇:

你可能感兴趣的:(算法,算法竞赛,算法,算法竞赛)