type
status
date
slug
summary
tags
category
icon
password
DrimTech Online Judge(DTOJ,数字创想社在线评测系统)即日起上线投入使用,标志着社团基础设施的建设迈进了一大步。它可用于发布信竞相关的题目、比赛、训练和作业,并对递交的代码进行自动评测。
没错,DrimTech 的 OIer 有了自己的私有化 OJ。即日起,信息学奥赛系列线上课的作业将在这里发布,不定期举行的比赛同样在这里发布。您可以在首页右上角看到链接。
🤔 什么是 Online Judge?
Online Judge 指的是在线评测系统,简称 OJ,是一种用来测试算法程序正确性的在线系统。
Online Judge 多用在编程竞赛和编程练习中,用户可以通过提交自己的代码,让系统帮助测试程序是否能根据输入输出正确的结果,从而达到检验程序的正确性、空间和时间消耗程度的目的。
OJ 能够编译并执行代码,使用预设的数据对这些程序进行测试。提交的代码一般会在受限的环境下运行,包括时间限制、内存限制、安全限制等。代码的输出会被 OJ 捕获,与标准答案进行比较后返回结果。
近年来(2016 年或更早)亦出现一些针对求职面试的在线评测系统。许多 OJ 网站会自发组织一些竞赛。此外,OJ 网站通常会设立用户排名,以用户的提交答案通过数多少或某个题目执行时间快慢为排名依据。
算法题目
这里以洛谷入门第一题 A+B Problem 为例。
各个 OJ 网站首先会出一道非常简单的题目来给用户进行测试,熟悉一下界面的操作流程,比如 要求输出“Hello World”,要求输出两个数的和等。
题目还会分难度、分题型等,用户可以根据自身情况选择去做。
题目描述
题目描述负责说明题目和要求,并且说明数据的范围以及输出要求。
输入输出样例
这里会说明输入输出的格式,以及给出一个或多个输入输出的样例,方面用户进行理解以及进行自我验证。这里需要注意,通过了样例的输入并不意味着程序就是正确的,在样例中给出的输入往往是最普通的值,而在实际评测时,会测试多个输入来检验程序,输入的数据十分刁钻,包含各种分类值、边界值。
程序限制
计算机资源并非无限,所以需要算法所使用的内存限制在一定范围内,运行时间不能超出时间限制,毕竟如果超出了时间限制,那可能是算法复杂度较高,不是一个较好的算法。
不同的题目和不同的 OJ 网站,所做出的限制并不是完全一样的。
- 时间限制可能会根据题目所使用的算法本身复杂度和编程语言进行调整,通常是 1 秒或 2 秒。
- 各网站设置的内存限制大多是 32MB,64MB 和 128MB 左右。
评测状态
提交代码后,系统会对代码进行编译,如果编译通过,那么会将各个测试点的数据作为输入,程序运行后读取数据并进行输出。系统会对程序的输出和正确答案进行比较,对输出结果进行判定。一个题目有多个测试点,会将程序运行数次。
程序运行过程中也有可能会因为各种各样的问题而导致程序异常终止,系统会对这些问题进行判定。
在提交程序之后,在线评测系统会根据题目的评测情况,返回评测结果。只有返回 Accepted 状态,才表示题目通过,选手才会获得成绩。不同 OJ 评测结果略有出入,但常见的评测结果大致分为以下 10 种。
状态 | 全称 | 含义 | 可能的原因 |
AC | Accepted | 程序通过 | 有问题吗?没有问题! |
PC | Partially Correct | 部分正确 | 输出的结果中有部分是错误的。某些评测系统会有这个评测状态。 |
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 | 未知错误 | 系统因其它原因造成的错误。 |
优化选项
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 模式编译出来的执行文件相比,速度可能会慢几十倍。
- 作者:DrimTech
- 链接:https://drim.cc/hello-dtoj
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章