HUSTOJ中Special Judge题目的处理方法


HUSTOJ中Special Judge题目的处理方法

主要步骤有:

1、在题目后台编辑页面启用该选项,如图1所示。
?

图1

2、编制data.in、data.out、spj.cc(或spj.c)。

3、编译出spj,设执行权限,连同2中的三个文件一起上传至服务器。

编制完spj.cc后,将这些文件上传至服务器。

登录服务器以后进入/home/judge/data/[题号]文件夹,执行以下操作:

例如:/home/judge/data/1000

acm@acm:/home/judge/data/1000sudo vim spj.cc #编辑spj.cc 文件,一般本地编好上传

acm@acm:/home/judge/data/1000sudo g++ -o spj spj.cc # 编译 spj.cc为可执行程序spj

acm@acm:/home/judge/data/1000sudo chmod +x spj        #添加spj的执行权限

下面给出一个具体案例:

例题:给出一个不小于12的正整数n,请你输出两个合数,使他们的和等于n。

分析题意,可以得出系统判断用户输出是否正确的两个条件是:

1、输出的两个数是否均为合数;

2、输出的两个数之和是否为n。

编写spj.cc(特判程序)。HUSTOJ中的spj.cc需要有3个文件名参数传入:测试输入、测试输出、用户输出。

spj的返回值决定着判断结果,成功返回(0)表示AC,其他非零值表示WA。

下面给出一个本题spj.cc的示例代码。

#include 
using namespace std;
bool is_prime(int x) {
	if (x < 2) return 0;
	for (int i = 2; i <= sqrt(x); ++i) if (x % i == 0) return 0;
	return 1;
}
int main(int argc, char *args[]) {
	//主函数
	FILE * f_in = fopen(args[1], "r"); //测试输入
	FILE * f_out = fopen(args[2], "r"); //测试输出
	FILE * f_user = fopen(args[3], "r"); //用户输出
	int ret = 0; //返回值
	int T, n, a, b;
	fscanf(f_in, "%d", &T); //从输入中读取数据组数T
	while (T--) {
		fscanf(f_in, "%d", &n);
		fscanf(f_user, "%d%d", &a, &b);
		if (a + b != n || is_prime(a) || is_prime(b)) ret = 1;//Wrong Answer
	}
	fclose(f_in);
	fclose(f_out);
	fclose(f_user);
	return ret;
}