Special Judgewindows
一般的ACM題目包括如下幾項內容:題目描述(Description)、輸入描述(Input)、輸出描述(Output)、樣例輸入(Sample Input)、樣例輸出(Sample Out),在後臺則包括測試輸入(Input Data)和測試輸出(Output Data)兩項。在評測用戶提交的程序正確與否時,系統會將樣例輸入和測試輸入重定向做爲程序的標準輸入,經過判斷程序對應的輸出是否與期待的輸出徹底相同,來判斷解答是否正確。服務器
對於同一道題目,用戶可能使用各類不一樣的方法來解答,因此對於某些特殊的題目,其結果可能不惟一,但都符合題目要求。此類題目就須要進行特判(Special Judge)。HUSTOJ便提供了特判功能。函數
這些題目主要有兩種:
一、答案不惟一。
二、控制精度。題目要求輸出精度偏差在某eps以內。測試
【使用方法】spa
第一步,在添加題目時,Special judge勾選Y,以打開系統的特判命令。.net
第二步,編寫spj代碼,模板中標註了spj代碼區域,自行根據題目要求編寫。注意文件名最後以.cc爲後綴。命令行
【模板】控制精度爲例,對比輸出文件和用戶結果文件,偏差不超過1e-5則Accepted。blog
#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;
}
【模板解釋】ip
HUSTOJ的spj用了命令行參數argc和argv,其中argv[1]指向輸入數據(即題目測試輸入),argv[2]指向輸出數據(題目測試的輸出數據,有時不須要),argv[3]指向用戶提交的程序所運行輸出的文件。分別讀取三個文件,作相應的對比。main函數的返回值表示判斷結果。 當發現用戶的輸出文件有誤時,return 1; 徹底正確時,return 0;ci
注意讀取三個文件時所有用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。