博主找了時間研究了 Arbiter 如何評測 SPJ。發現網上幾乎沒什麼資料。
題目配置的比較器改爲自定義,將 Linux 下編譯好的比較器(不帶後綴名的)放在比賽目錄的 filter
文件夾內(裏面有許多自帶的比較器)。
比較器的代碼?下面放一份框架
... // 該寫啥寫啥
int main(int argc, char *argv[]) {
// Arbiter 調用時,argc = 4。
// argv[0] 爲 比較器名稱
// argv[1] 爲 當前測試點輸入數據的絕對路徑。該文件被複制一份於比賽目錄下的 tmp 文件夾裏,且只讀。選手的代碼、編譯的程序、這份比較器、輸入文件、選手輸出均在該文件夾中,答案文件不在其中。
// argv[2] 爲 選手輸出的絕對路徑,指向 tmp 文件夾中的輸出
// argv[3] 爲 答案文件,指向比賽目錄下的 evaldata 中的答案文件
FILE in = fopen(argv[1], "r");
FILE out = fopen(argv[2], "r");
FILE ans = fopen(argv[3], "r");
// 使用 fscanf 讀取 in、out、ans 中的信息。如果是構造之類的題,很可能不需要 ans
if (check() == true) {
puts("10"); // AC
puts("Correct Answer!"); // Log
} else {
puts("0"); // WA,0/10 Pt
puts("There's Something Wrong!"); // Log
}
// 根據程序的判斷,接着向標準輸出中輸出兩行信息:分數、反饋信息('Accept'、'%d percent correct' 等任何你想寫的信息。這裏分數滿分是十分,Arbiter 會根據測試點分值自動換算得分
}
簡單解釋就是要傳參數,標準輸出返回結果。可能兩行反饋寫反了到時候自己試一試就行了。
Arbiter 更新了,評測過程無法修改 .in
文件了。NOIP2020 的事件應該不會發生了(