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/1000$ sudo vim spj.cc #编辑spj.cc 文件,一般本地编好上传 acm@acm:/home/judge/data/1000$ sudo g++ -o spj spj.cc # 编译 spj.cc为可执行程序spj acm@acm:/home/judge/data/1000$ sudo 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; }