教你制作测试点

· · 个人记录

目录

[前言]()

前言

做好了题目,测试点怎么做呢?

本文章含有:制作测试点的基本步骤、测试点的配置、自定义计分脚本、Special Judge、交互库

更好的阅读体验?

基本测试点

首先需要创建几个.in.out文件,.in是要输入的内容,.out是程序应该输出的内容。

名字可以直接是 001.in 001.out 002.in 002.out 003.in 003.out,也可以在数字的前面添加一些字母,如test001.in test001.out

P1001~A+B~problem 为例.
001.in可输入:

1 1

001.out可输入:

2

002.in可输入:

7 8

002.out可输入:

15

做好了测试点,需要创建一个.zip类型压缩包(.rar不行),打包上传,压缩包的名字随意,我一般取题目编号。

测试点配置

网页直接配置

每个测试点都可以设置时间限制(ms)、空间限制(MB)、子任务(基本上就是给测试点一个分类)和分值(如果做对了得多少分)。

上传之后会显示,里面会有一个默认值,可以改,如果想让所有测试点都遵照一个,可以在最上面那个空写。

配置文件

配置文件的名字必须是config.yml,放在测试点压缩包中,格式为:

001.in:
  timeLimit: 10
  memoryLimit: 1024
  isPretest: false
  subtaskId: 3
  score: 50
002.in:
  subtaskId: 0
  score: 50

自定义计分脚本

可在Subtask里选自定义计分方式,然后在右边的框里写。

例:

if (@status4 == AC) and (@status3 == AC or @status5 == AC); then
    @total_score = 30;
    @final_status = AC;
    @final_time = @time4;
    @final_memory = @memory4;
else
    @total_score = 0;
    @final_status = UNAC;
    @final_time = 0;
    @final_memory = 0;
fi

语法:

常量:

测试点:

子任务:

变量:

名字必须是checker.cpp,放在测试点压缩包中,题目还要加上Special Judge标签,格式为:

#include "testlib.h"
using namespace std;
int main(int argc,char *argv[]){
    registerTestlibCmd(argc,argv);
    setName("out with ans xiangcha not 0.1");
    while(!ans.eof()){
        double out=ouf.readDouble();
        double answer=ans.readDouble();
        ans.readEoln();
        if(fabs(answer-out)>0.1)
            quitf(_wa,"wrong, ans:%lf, out:%lf",answer,out);
    }
    quitf(_ok,"This is ok.");
}

以上例子是输出与标准答案相差不超过0.1则AC。

注意事项:

语法:

ans、ouf、inf的成员函数;

是可以测试的,前提是你把Testlib头文件下载了。

windows系统要输入:

checker.exe in.txt out.txt ans.txt

Linux系统要输入:

./checker in.txt out.txt ans.txt

in.txt out.txt ans.txt分别是输入输出和正确答案,这个只是测试用,不要一起打包。

交互库

交互库必须叫interactive_lib.cpp要带上交互题标签

交互库实际上就是让用户把没有写完的函数写完。

例:

#include<iostream>
using namespace std;
extern "C"{
    extern int jc(int x){
        return jc(x-1)*x;
    }
    extern int solution(int a,int b,int c);
}
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    cout<<solution(a,b,c)<<endl;
    return 0;
}

除了main以外函数名字随便改,只有main在外面其他都在extern里面。

除了一个要用户自己写的函数外,可以为用户定义一个函数,当然不定义也可以,定义了用户就可以直接使用写好的函数,不用自己写了。

比如例子就是solution要用户写,jc是提供给用户的函数。

如果题目要 (a!+b!)^c 的值,用户应该这样写:

#include<cmath>//交互库没有导入这个头文件,要导入一遍
extern "C" int jc(int);//要把给的函数先定义一遍
extern "C" int solution(int a,int b,int c){
    return pow(jc(a)+jc(b),c);//return
}

用户不需要写main函数,也不应该写。

后记

实际上交互库可以和SPJ连接,不过我不会,可以去看洛谷,不过我估计你看不懂:)

$\color{blue}thanks~for~watch!$\ $\color{red}thanks~for~watch!$\ $\color{yellow}thanks~for~watch!$\ awa