[转]Special Judge在HUSTOJ中的使用

来源:互联网 发布:金管家进销存软件 编辑:程序博客网 时间:2024/05/16 08:11

主要步骤有:

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

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

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

例一
下面以UPCOJ中的一道题目为例说明SPJ在HUSTOJ中的使用。
(题目版权归原平台、作者所有,本文给出示例并不代表原题目使用同样方法进行评测。)

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

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

输出的两个数是否均为合数;
输出的两个数之和是否为n。
首先分别制定data.in(测试输入)、data.out(测试输出)如下:

filename: data.in

3
12
15
1000

filename: data.out
8 4
9 6
500 500

然后编写spj.cc(特判程序)。HUSTOJ中的spj.cc需要有3个文件名参数传入:测试输入、测试输出、用户输出。
spj的返回值决定着判断结果,成功返回(0)表示AC,其他非零值表示WA。
下面给出一个本题spj.cc的示例代码。

filename: spj.cc

#include <stdio.h>bool is_prime(int x)//判断素数,伪代码{if(x是素数)return true;elsereturn false;}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);//从输入中读取数据组数Twhile(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;}

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

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

/home/judge/data/1000

acm@acm:/home/judge/data/1000$ sudo vim spj.cc #Edit the file spj.ccacm@acm:/home/judge/data/1000$ sudo g++ -o spj spj.cc # gcc -o spj spj.cacm@acm:/home/judge/data/1000$ sudo chmod +x spj

测试:

/home/judge/data/1000

acm@acm:/home/judge/data/1000$ ./spj data.in data.out data.outacm@acm:/home/judge/data/1000$ echo $?0 #Acceptedacm@acm:/home/judge/data/1000$ ./spj data.in data.out data.inacm@acm:/home/judge/data/1000$ echo $?1 #Wrong Answer

在本地HUSTOJ测试,通过网页提交,通过。

例二

某题目要求经过一定复杂计算后输出一个实数结果,精度要求控制在10−4内。
分析题意,可知spj需要判断测试输出a与用户输出x之差是否在eps之内。
spj.cc 如下:

filename: spj.cc

#include <stdio.h>const double eps = 1e-4;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;double a,x;fscanf(f_in,“%d”,&T);//从输入中读取数据组数Twhile(T–){fscanf(f_out,“%lf”,&a);fscanf(f_user,“%lf”,&x);if(fabs(a-x)>eps)ret = 1;//Wrong Answer}fclose(f_in);fclose(f_out);fclose(f_user);return ret;}
原创粉丝点击