Skip to content

使用 Special Judge

luosw edited this page Aug 7, 2020 · 1 revision

使用 Special Judge

Special Judge (简称:spj,别名:checker)是当一道题有多组解时,用来判断答案合法性的程序。

判断浮点数时应注意 NaN。不合理的判断方式会导致输出 NaN 即可 AC 的情况。

在对选手文件进行读入操作时应该要检查是否正确读入了所需的内容,防止造成 spj 的运行错误。(部分 OJ 会将 spj 的运行错误作为系统错误处理)。

一些题目要求输出浮点数,但是会有精度误差。

上面这些东西,用 Special Judge 都可以很好地解决。下面介绍对于 CarYon 的对拍器中 Special Judge 的写法。

请按照下面的格式编写 spj:

#include<bits/stdc++.h>
using namespace std;
#define UKE -1
#define AC 1
#define WA 0
int Special_Judge(FILE* file_compared, FILE* file_checked){
   //Your SPJ, Accept return 1, Wrong Answer return 0.

}
int main(int argc,char* argv[]){
	if(argc<=2){
		return UKE; //此行不用修改
	}
	FILE* fuser=fopen(argv[1],"r"); //myprogram.exe 输出文件
	FILE* fstd=fopen(argv[2],"r");  //std.exe 输出文件
	if(Special_Judge(fuser,fstd)==1){
		return AC;
	}
	else {
		return WA;
	}
	return 0;
} 

下面是使用说明:

程序的返回值决定了评测的结果(TLE由 CarYon 判断,不由 spj 判断),其中主函数的参数 argv[1]myprogram.exe 输出的文件名,argv[2] 则是标准程序输出的文件名,fuser,fstd 两个文件指针分别指向两个程序输出的文件。

您需要做的是编写 Special_Judge 函数,函数返回 1 则程序AC,返回0则程序WA

编写完请把程序保存至tools/Compare并编译成spj.exe,在caryon.h中,搜索:

std::string command="tools\\Compare\\NOIPStyle.exe debug-"+dataname+"//"+dataname+Debug1+".ans data-"+dataname+"//"+dataname+Debug1+".out";

改为:

std::string command="tools\\Compare\\spj.exe debug-"+dataname+"//"+dataname+Debug1+".ans data-"+dataname+"//"+dataname+Debug1+".out";