如何實現 Arbiter 的 Special Judge 評測任務

博主找了時間研究了 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 的事件應該不會發生了(

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章