对于当正确的输出结果不唯一的时候,我们就需要使用自定义校验器们,也就是我们常说的Special Judge。一般来说我们需要自己编写Special Judge的判断程序,不同的评测系统对于Special Judge的要求也不一样,下面就来谈一谈Cena和Lemon的Special Judge。

Cena

首先,Cena的帮助里面是这样说的:

3.2.2 自定义校验器说明
获取必要的信息
待测的测试点的最高分 ParamStr(1)(Pascal) 或 argv1
标准输出文件名 ParamStr(2)(Pascal) 或 argv2
标准输入和选手输出同数据配置。
结果返回
得分返回文件 score.log 只有一行,为这个测试点的得分。可使用小数。
返回校验信息 report.log 若没有此文件,或此文件的内容为空,则没有校验信息,反之则将在评测结果右侧显示“(?)”,点击则显示信息。(参见: 查看评测结果)。
交互单元
本评测系统提供了编写校验程序的交互单元,以方便使用 Pascal 语言编写自定义校验程序。
libcheck.pas(位置:安装路径\lib) 说明如下:
变量:

std: Text;                        { 用于读取标准输出文件 }
rep: Text;                        { 用于写入校验信息 }
fso: Double;                      { 为这个测试点的满分 }

过程:

procedure Score(AScore: Double);  { 用于向评测系统报告得分 }
procedure Finish;                 { 结束 }

使用举例 (Pascal语言):

useslibcheck;
vara,b,c,stc: integer;
beginassign(input, 'add.in'); { 试题的输入文件名 }reset(input);readln(a, b);close(input);assign(input, 'add.out'); { 试题的输出文件名,由选手程序输出 }reset(input);readln(c);close(input);read(std,stc); { 从标准输出文件中读取标准答案 }writeln(rep,'这个测试点的输入为:',a,' ',b);writeln(rep,'标准输出为:',stc);writeln(rep,'选手输出为:',c);if stc=c then beginwriteln(rep, '正确。');Score(fso); { 得满分 }endelse beginwriteln(rep, '错误。');Score(0); { 得 0 分 }end;writeln(rep, '本自定义校验程序由 *** 提供。仅供示例。');Finish;
end;

建议
请使用 32 位编译器(如 Free Pascal, Delphi, GCC )来编译您的校验程序,以加快评测的速度。

简单地来说,就是:

“score.log” 输出最终得分
“report.log”输出错误报告
#FILENAME”.in”输入文件
#FILENAME”.out”选手输出文件
argv[2]:标准输出文件
argv[1]:单测试点分值

下面是一个我用的板子

#include<cstdio>
#include<cstdlib>
#include<cmath>FILE *fscore,*freport,*fstd,*fin,*fout;  int Judge()
{  fscanf(fstd,/*******/);fscanf(fout,/*******/);//judge函数
}
int main(int argc,char *argv[])
{  fscore=fopen("score.log","w");  //打开得分文件  freport=fopen("report.log","w");//打开报告文件  fstd=fopen(argv[2],"r");        //打开测试点标准输出文件  int score=atoi(argv[1]);        //取得测试点的分数  fin=fopen("circle.in","r");   //打开测试点标准输入文件  fout=fopen("circle.out","r"); //打开用户的数据输出文件  if (!fout)  {  fprintf(fscore,"%d",0);     //返回0分  fprintf(freport,"没输出你交上来干啥");//报告Judge结果为no output  }  else if (Judge()==1)  //Judge后结果为真  {  fprintf(fscore,"%d",score);//返回满分  fprintf(freport,"太厉害了,被你A了");  //报告Judge结果为right  }  /*部分分else if (Judge()==-1)   {  fprintf(fscore,"%d",score<<1);//返回部分分  fprintf(freport,"你可能被卡精度了");  }*/else  if (Judge()==0){  fprintf(fscore,"%d",0);  //返回0分  fprintf(freport,"你愉快地WA了");//报告Judge结果为wrong  }  fclose(fscore);//关闭得分文件  fclose(freport);//关闭报告文件  return 0;
}  

写好之后我们只需要把SPJ程序放到Data文件下,注意一定要运行生成exe文件。
然后把比较方式换成使用自定义校验器
然后就可以了

Lemon

这个我也不是很熟悉

所有的都从argv[]里面读入
argv[1]:输入文件
argv[2]:选手输出文件
argv[3]:标准输出文件
argv[4]:单个测试点分值
argv[5]:输出最终得分的文件
argv[6]:输出错误报告的文件

然后lemon的spj就大概这样写

int main(int argc,char *argv[]){fin.open(argv[1]);fout.open(argv[2]);fstd.open(argv[3]);fscore.open(argv[5]);freport.open(argv[6]);int score=atoi(argv[4]);fscore<<score*Judge()<<endl;fin.close();fout.close();fstd.close();fscore.close();freport.close();retur

学习一个Cena和Lemon的SPJ相关推荐

  1. 为什么 Web 开发人员需要学习一个 JavaScript 框架?

    原文链接 可能当我们结束本文时,一个新的 Javascript 框架已经在某处启动了.但这确实不在我们的控制范围内.因此,我们应该简单地继续我们所拥有的.至少,由于免责声明,我们可以确定我们不是在发明 ...

  2. C语言学习一个月后感想

    C语言学习一个月后感想 感谢李晓东老板及计算机工程师联盟的学长学姐和某神秘同级同学的辛勤指导,感谢宋雨田的督促和陪伴. 初识C的1..体会 我本以为凭借瓜皮思维和花里胡哨操作可以让我熟练地学习语言,现 ...

  3. linux学习一个服务(未完)

    学习一个服务的过程 1.了解服务的作用:名字 功能,特点 2.安装 3.配置文件位置,端口 4.服务启动关闭的脚本 5.此服务的使用方法 6.修改配置文件,实战举例 7.排错(从下到上,从内到外) 转 ...

  4. N天学习一个Linux命令之帮助命令:man

    前言 工作中每天都在使用常用的命令和非常用的命令,忘记了用法或者参数,都会bing一下,然后如此循环.一直没有真正的系统的深入的去了解命令的用法,我决定打破它.以前看到有人,每天学习一个linux命令 ...

  5. linux set命令例子,学习一个 Linux 命令:declare/typeset 命令

    原标题:学习一个 Linux 命令:declare/typeset 命令 1 功能简介 declare(别名 typeset)属 Shell 内建命令,用于申明 Shell 变量并设置变量属性,或查看 ...

  6. 如何学习一个新的系统

    如何学习一个新的系统 学习系统主要分为三个部分 一.业务学习可以从如下几点寻找答案 系统所在行业的情况是怎样? 系统的目标用户是谁?比如是给公司高层做决策用?给运营或客服用?还是互联网用户用? 平均有 ...

  7. 你应该如何学习一个未知的技术领域?- 菜鸟小白篇

    一.前言 2018年初开始从事线上课程的开发,陆续开发了几门课程,<人工智能产品经理最佳实践请添加链接描述><知识图谱实战开发完全剖析请添加链接描述>和<智能对话机器人实 ...

  8. 每天学习一个Android中的常用框架——0.目录

    文章目录 1.前言 2.环境 3.目录 3.1 持久化 3.1.1 Litepal 3.1.2 GreenDao 3.1.3 Realm 3.1.4 DBFlow 3.2 网络传输 3.2.1 OkH ...

  9. [0406]学习一个——Unit 1 Html、CSS与版本控制

    前言 最近发现了Github的Student认证,本来想用来注册Digital Ocean搭个梯子,结果注册验证不能用VISA借记卡=~=. 那么在这漫长的清明节假期里,只有学习能满足空虚的内心(划掉 ...

最新文章

  1. git 强制推送_Git 常用命令清单,掌握这些,轻松驾驭版本管理
  2. 解读《这就是 OKR》 | OKR 的四大价值
  3. python导入其他py文件-Python中py文件引用另一个py文件变量的方法
  4. Linux 卷管理详解[ pv vg lv] —— 之三
  5. android 聊天功能实现,Android聊天背景功能实现
  6. 删除目录及目录下所有文件与子目录
  7. shell编程之进阶篇四简单流程控制
  8. ideahtml标签不提示_仓储物流加速,电子标签亮灯拣选系统的优势
  9. mavros 基于体轴坐标系下的无人机行人跟踪
  10. [Python] L1-008. 求整数段和-PAT团体程序设计天梯赛GPLT
  11. 执行update操作的话,就会报“Connection is read-only. Queries leading to data modification are not allowed”的异常。
  12. 单目视觉里程计的尺度问题的疑问?
  13. 翻译: TensorFlow 2.0 中的符号和命令式 API 是什么?
  14. Matlab2021a安装教程
  15. 微信小程序获取用户信息及手机号授权的流程
  16. linux make menuconfig快速查找配置项
  17. 驾驶证期满换证流程(杭州篇)
  18. InstallShield Professional,开发解决方案
  19. 三星S95Z / S90Z OLED 电视 评测
  20. iPhone手机史上最全的扫盲帖【越狱,解锁,激活,Cydia,基带,裸机】

热门文章

  1. ps2模拟器bios3dm_呆萌ps2模拟器bios文件
  2. 通过AD旋钮(编码器)改变数据,C语言实现
  3. MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度
  4. WM8960声卡相关问题
  5. 复旦大学桂韬:Uncertainty—Aware Sequence Labeling
  6. Windows磁盘管理工具Diskpart之一 管理基本磁盘
  7. 自考深圳大学计算机专业难吗,深圳大学自考难吗
  8. CSDN报验证码错误
  9. 分析BDA——Base Data Augmentation对方向分类器的作用
  10. #BDA#笔记#阶段一:制作数据分析报告