前言
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本人写这篇文章的原因主要是想写一道题,在做 Data 的时候发现这题要用 SPJ,要写一个 checker.cpp,结果发现 ACGO 官方竟然没有发布关于 SPJ 配置教程的帖子(),最后翻了翻洛谷文档、OIwiki 加求助帖终于配置出来了,所以想写一篇文章,让大家更好的使用 ACGO SPJ。
前置
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
你需要在阅读正文前了解以下两点:
1. SPJ 是 Special Judge 的缩写,意思是 特判程序。
在 OI 这类编程比赛里,普通题目是“文本对比判题”——你的输出必须和标准答案 一模一样(空格、换行都不能错)。
但有些题不适合死板对比(例如构造题),这时候就用 SPJ。
2. ACGO 的 SPJ 是基于 testlib 的。
正文
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TESTLIB 的常用方法
我们先来了解一些 testlib 的方法:
读入:
inf 指数据输入文件,ouf 指选手输出文件,ans 指标准答案。
void registerTestlibCmd(argc, argv)
初始化 checker.cpp。
char readChar()
读入一个字符。
char readChar(char c)
和上面一样,但是只能读入字母 c,如果不是直接判 WA。
char readSpace()
同 readChar(' ')。
string readToken()
读入一个字符串,但是遇到空格、换行、eof 为止、
long long readLong()
读入一个 longlong/int64。
long long readLong(long long L, long long R)
同上,但是限定范围(包括 L,R)。
int readInt()
读入一个 int。
int readInt(int L, int R),
同上,但是限定范围(包括 L,R)。
double readReal()
读入一个实数。
double readReal(double L, double R),
同上,但是限定范围(包括 L,R)。
double readStrictReal(double L, double R, int minPrecision, int maxPrecision),
读入一个限定范围精度位数的实数。
string readString(),
string readLine()
碰撞一行 string,到换行或者 eof 为止
void readEoln()
读入一个换行符
void readEof()
读入一个 eof
int eof()
用 <file>.<function> 的方法读入。
返回程序结果:
quitf(_ok, "<introduce>");
给出 AC。
quitf(_wa, "<introduce>");
给出 WA。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SPJ 常用背景
小数误差
我们先用一道例题:
> 输入 p,qp,qp,q,请输出 pq\dfrac{p}{q}qp 的值,误差 ≤10−5\le 10^{-5}≤10−5 即为正确。
来进行接下来的讲解。
我们的程序需要做以下操作:
1. 初始化
2. 读入 ouf 和 ans 的数。
3. 判断差值是否 ≤10−5\le 10^{-5}≤10−5。
4. 返回结果。
checker.cpp 如下:
构造题
有时,题目是一道构造题,没有统一的解法,这时 *.out 怎么办?可以把所有的 *.out 内容清空,在 checker.cpp 判断构造是否满足要求。例如:
> 给定一个小数 aaa,构造 p,qp,qp,q 满足 a=pqa = \dfrac{p}{q}a=qp 。
这题没有唯一解,在做 Data 的时候可以把所有的 *.out 设为空,在 checker.cpp 中读入 inf 和 ouf 并比较即可,checker.cpp 如下: