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;
}
posted @ 2018-09-18 17:10  naiij  阅读(921)  评论(0编辑  收藏  举报