Special Judge 功能说明
当一道题目的答案不唯一,即存在多组符合要求的解时,必须使用 Special Judge(以下简称 SPJ)进行评测。
SPJ 程序会根据输入数据以及其他相关信息来判定选手程序的输出是否正确,并返回评测结果。
洛谷采用的 SPJ 标准与 Codeforces 一致,均基于 Testlib 库。
下载地址:
https://github.com/MikeMirzayanov/testlib/releases/download/0.9.41/testlib-0.9.41.zip
在洛谷上,SPJ 的编译参数为:g++ -fno-asm -std=c++14 -O2,即已经开启 C++14 以及 O2 优化。
使用方法
基础教程
SPJ 仅支持使用 C++ 编写。其编写方式与普通题目类似,主要区别在于输入输出的处理。首先创建文件 checker.cpp,并将上述压缩包中的所有内容解压至与该文件相同的目录下。
以下为一个简单示例:若选手答案和标准答案输出的差值小于 ,则判定为通过(AC),否则判定为错误(WA)。
#include "testlib.h"
int main(int argc, char* argv[]) {
setName("compares two doubles");
registerTestlibCmd(argc, argv); // 初始化 checker,必须在最前面调用一次。
double pans = ouf.readDouble(); // 从选手输出读取一个 double 类型变量
double jans = ans.readDouble(); // 从标准答案读取一个 double 类型变量
if (fabs(pans - jans) < 0.01) // 如果差值小于 0.01,返回答案正确
quitf(_ok, "The answer is correct.");
else // 否则返回答案错误
quitf(_wa, "The answer is wrong: expected = %f, found = %f", jans, pans);
}
在 Testlib checker 中,不使用 cin/cout 来读写判题数据,而是使用三条输入流(由评测系统提供):
inf:测试输入文件(题目输入数据),在上例中未使用;ans:标准答案文件(参考输出/最优值/一组可行解等,不一定唯一);ouf:选手输出文件(你要判定的对象);
Checker 的职责通常是验证 ouf 是否满足题意(例如:选手的输出是否是一组合法的可行解)。
在 testlib.h 中,有四种常见的答案判定:
_ok:通过本题;_wa:答案错误;_pe:格式错误(洛谷目前不支持此类评测结果);_fail