UOJ的special judge写法
配置步骤
修改problem.conf
和传统题配置相比,spj的题区别就在于自定义了checker。
这里我们需要先把problem.conf中的use_builtin_checker
一行删去。
chk.cpp
在数据文件夹下新进一个文件命名为chk.cpp
。
UOJ的cheker使用testlib,下面是A+B
的checker:
#include "testlib.h"
int main(int argc, char* argv[])
{
registerTestlibCmd(argc, argv);
int pans,jans;
pans=ouf.readInt(); // 读取选手输出
jans=ans.readInt(); // 读取答案
if (pans == jans)
quitf(_ok, "Correct.");
else
quitf(_wa, "WA! expect=%d recieve=%d", jans, pans);
}
在调用registerTestlibCmd
之后,我们可以使用下面的三个流:
inf
: 输入数据ouf
: 选手输出ans
: 标准输出
从流中读取数据的方式,和【数据检验器】一致。
如果程序AC或者爆零,您可以使用quitf()
。但是如果您想给选手部分分,请使用下面的代码:
quitp(p / x, "You get %d score", p);
x表示这道题的测试点数,p表示获得的部分分。
注意: 如果使用quitp,分数一定要是double类型,否则编译不过,而且提示信息看不到。
chk.cpp中不能出现中文!
demo
number
题目描述
给定整数 \(m,k\),求 出正整数 \(n\) 使得 \(n+1,n+2,…,2n\) 中恰好有 \(m\) 个数
在二进制下恰好有 \(k\) 个 \(1\)。有多组数据。
输入数据
第一行一个整数 \(t\) 表示数据组数。接下来 \(t\) 行每行两个整数 \(m,k\)。
输出数据
每组数据输出一行两个整数,第一个数表示 long long 范围内任意
一个满足条件的 \(n\),第二个数表示满足条件的 \(n\) 的个数(无穷多用-1
表示) 。
保证 \(10^{18}\) 以内存在满足条件的 \(n\)。
如果每组数据第一个数全部正确,得 4 分。
如果每组数据第二个数全部正确,得 6 分。
#include "testlib.h"
#include <bits/stdc++.h>
using namespace std;
string tostring(long long x) {
string s = "";
do s += char('0' + x % 10), x /= 10; while (x);
reverse(s.begin(), s.end());
return s;
}
int main(int argc, char* argv[]) {
registerTestlibCmd(argc, argv);
int t = inf.readInt(), a = 4, b = 6;
long long al = 0, ar = 0, bl = 0, br = 0;
while (t--) {
long long L = inf.readLong(), R = inf.readLong();
long long l = ans.readLong(), r, x, y, w;
if (l == -1) {
l = 1;
long long x = 1;
r = (x << 63) - 1;
w = -1;
} else {
r = ans.readLong();
w = r - l + 1;
}
x = ouf.readLong(), y = ouf.readLong();
if (a != 0 && (x < l || x > r))
a = 0, al = L, ar = R;
if (b != 0 && y != w)
b = 0, bl = L, br = R;
}
string s;
if (a == 4 && b == 6) s = "You pass this case";
if (a == 0) s = "For m=" + tostring(al) + ", k=" + tostring(ar) + ", your n is wrong. ";
if (b == 0) s += "For m=" + tostring(bl) + ", k=" + tostring(br) + ", your count is wrong";
quitp((a + b) / 10.0, "%s", s.c_str());
return 0;
}