HUSTOJ特判程序Special Judge使用方法整理
2021.08.12更新:最新优化的编写方法请参见https://blog.csdn.net/winter2121/article/details/104901188
Special Judge
通常的ACM题目包括以下几项内容:题目描述(Description
)、输入描述(Input
)、输出描述(Output
)、样例输入(Sample Input
)、样例输出(Sample Out
),在后台则包括测试输入(Input Data
)和测试输出(Output Data
)两项。在评测用户提交的程序正确与否时,系统会将样例输入和测试输入重定向作为程序的标准输入,通过判断程序对应的输出是否与期待的输出完全相同,来判断解答是否正确。
对于同一道题目,用户可能使用各种不同的方法来解答,所以对于某些特殊的题目,其结果可能不唯一,但都符合题目要求。此类题目就需要进行特判(Special Judge)。HUSTOJ便提供了特判功能。
这些题目主要有两种:
1、答案不唯一。
2、控制精度。题目要求输出精度误差在某eps之内。
【使用方法】
第一步,在添加题目时,Special judge勾选Y,以打开系统的特判命令。
第二步,编写spj代码,模板中标注了spj代码区域,自行根据题目要求编写。注意文件名最后以.cc为后缀。
【模板】控制精度为例,对比输出文件和用户结果文件,误差不超过1e-5则Accepted。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<set>
#include<utility>
using namespace std;int main(int argc, char* argv[]) {FILE * f_in=fopen(argv[1],"r");//测试输入FILE * f_out=fopen(argv[2],"r");//测试输出FILE * f_user=fopen(argv[3],"r");//用户输出int ret=0; //AC=0,WA=1/*****spj代码区域*******/int T,n;fscanf(f_in,"%d",&T);while(T--){double a,b;int n;fscanf(f_in,"%d",&n);fscanf(f_out,"%lf",&a);fscanf(f_user,"%lf",&b);if(fabs(a-b)>1e-5) //WA {ret=1;break;}}/*****spj-end********/ fclose(f_in);fclose(f_out);fclose(f_user);return ret;
}
【模板解释】
HUSTOJ的spj用了命令行参数argc和argv,其中argv[1]指向输入数据(即题目测试输入),argv[2]指向输出数据(题目测试的输出数据,有时不需要),argv[3]指向用户提交的程序所运行输出的文件。分别读取三个文件,做相应的对比。main函数的返回值表示判断结果。 当发现用户的输出文件有误时,return 1; 完全正确时,return 0;
注意读取三个文件时全部用fscanf(C++中fstream库操作也是可以的),读取出来后,只需要自己编写一下如何判断用户的输出是否正确。 可能有些题目很难,不好编写,这时候可以把标程放在spj区域(注意输入都改成fscanf),对比标程运行出来的结果和用户结果的差异是否在题目允许范围之内,来判断用户是否正确。
第三步,将.cc文件上传到服务器对应题目的数据文件夹下(也就是保存测试数据的那个文件夹),可以在上传数据时一同上传
第四步,在服务器上测试数据文件夹下,命令行执行 g++ -o spj spj.cc (spj是编译后的可执行程序,不要改名。spj.cc是你上传的代码文件,名称随意),个别服务器可能还需要权限,再执行一下:chmod +x spj 推荐一个windows下远程服务器命令:Putty,百度搜索即可下载。
第五步,测试。该步骤可省略。在上一步的命令行中,继续执行:./spj data.in data.out user.out ,然后再执行:echo $? 然后窗口会显示1(代表WA)或者0(代表AC),其中data.in 和data.out是测试数据,user.out是用户代码运行的结果。该步操作可模拟进行判断用户输出是否正确。
第六步,提交代码测试题目。建议提交一遍正确代码,再故意改动一下AC代码,提交错误代码,看是否成功WA。
HUSTOJ特判程序Special Judge使用方法整理相关推荐
- Special Judge(特判程序)在OnlineJudge(在线判题系统)中的使用方法
引言 最近搭了一个OnlineJudge,在一些比赛中,为了避免选手骗过测试,所以一个比较完善的OJ测试必须加上Special Judge 例如:题目要求:求a+b的值 测试用例: 输入1 2 输出: ...
- Special Judge Ⅲ(这道题考的就是出栈序列判定_关键代码不差什么)
Description Q:什么是 Special Judge,Special Judge 的题目有什么不同? A:一个题目可以接受多种正确方案,即有多组解的时候,题目就必须被 Special Jud ...
- UOJ的special judge写法
UOJ的special judge写法 配置步骤 修改problem.conf chk.cpp 配置步骤 修改problem.conf 和传统题配置相比,spj的题区别就在于自定义了checker. ...
- 废掉一个程序员最好的方法,让他忙碌着,忙碌到没时间思考
文|洪生鹏,来自|爱开发 01 好友老张最近又跳槽了,薪资比之前翻了一番,电话里说要请我们吃饭,印象中老张几乎是一年一跳.老张是一名java程序员,工作6年已经跳槽4次了.加上这次算5次了. 对于程序 ...
- Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏
Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏//获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType().Assembly.Loca ...
- winlogon.exe应用程序错误的解决方法
winlogon.exe应用程序错误的解决方法 参考文章: (1)winlogon.exe应用程序错误的解决方法 (2)https://www.cnblogs.com/haitao-fan/archi ...
- Mac 应用程序不能打开解决方法
Mac 应用程序不能打开解决方法 参考文章: (1)Mac 应用程序不能打开解决方法 (2)https://www.cnblogs.com/ghj1976/p/11855334.html 备忘一下.
- C# Winform应用程序占用内存较大解决方法整理(转)
C# Winform应用程序占用内存较大解决方法整理(转) 参考文章: (1)C# Winform应用程序占用内存较大解决方法整理(转) (2)https://www.cnblogs.com/xcsn ...
- 在 Linux 上找出并解决程序错误的主要方法【转】
在 Linux 上找出并解决程序错误的主要方法[转] 参考文章: (1)在 Linux 上找出并解决程序错误的主要方法[转] (2)https://www.cnblogs.com/sky-heaven ...
最新文章
- 黑马程序员---基础加强-----------------第二天(新特性:注解、泛型)
- QT开发(十二)——QT事件处理机制
- Android TV开发焦点动作控制小技巧
- mseq matlab,Matlab生成M序列
- 浅谈 CSRF 攻击方式
- SpingBoot 整合 kafka Elk
- 多线激光雷达遇到的问题
- java 中的builder_Java设计中的Builder模式的介绍
- 本特利前置器330180-50-00
- html5富文本编辑器菜鸟手册,富文本编辑器froalaEditor(全面)附教程
- 教你快速高效接入SDK——总体思路和架构
- Excel小技巧总结,工作中超实用
- 无人机航拍VR全景图拍摄制作教程
- 宝鲲:如何防范炒外汇风险
- 学计算机能考南京哪个大学,这三所南京市高校,适合报考计算机类专业,适合的考生不要错过...
- 内网工具 CS的基础使用
- jqury ajax 标准
- centos mysql 安装教程_CentOS中安装MySQL步骤详解
- 2019—猪年的愚人节
- php+转为文本,PHP将HTML转换成文本的实现代码