C 知識點 對拍

2022-04-07 10:37:50 字數 1320 閱讀 3536

~對拍~

一般的刷題時間,機房裡的dalao們用來檢查**的方式還是會以手造

毒瘤資料為主,手造資料更方便完全回顧**,且規模一般較小,除錯起來也容易。美中不足的是較小範圍的資料很可能觸及不到資料的邊界,以致該發現的問題沒發現,交到oj測評姬上被毒瘤資料反手一槍秒了。  

對拍是一種全自動的驗證程式。首先,你需要乙個std和乙個暴力解法。一段合格的std應該具有如下特點:思路正確,複雜度比暴力優,能編譯過去(大霧,小規模資料(比如樣例或者某些手造資料)可以輕鬆通過並合乎標準。而你的暴力解法則需要有以下特點:真的暴力,複雜度比std低一些,完全保證的正確性(暴力都寫不對還想要部分分?),能夠盡快處理大規模資料(看似矛盾,但其實只要能在截止前提交就行,對拍所用的時間簡直不值一提)。

當然,有了標程,就不能缺少資料生成器,不然再nb的std也排不上用場。資料生成器所生成的資料應該盡可能的,完全的隨機(windows的偽隨機數真是讓人淚目,linux環境下則要好很多),而且永遠永遠要合乎題意,當你生成一堆錯誤的資料去對拍,結果可想而知。

對拍的基本流程就是先用乙個輸入來獲得std和暴力的兩組輸出,判斷這兩組輸出是否完全相同,如果完全相同,哦那沒事了,下一組。如果兩者有地方不一樣(不是那些空格啊換行之類零碎而無關緊要的東西),那說明肯定是std出了問題(暴力保證正確的情況下)。如果無法保證暴力演算法的正確性,那麼可以對小規模資料進行手動模擬,對大規模資料進行估算等等操作,方便我們找出哪個演算法是內鬼(也許兩個都是內鬼也不一定(大霧。

那我們搞個板子來看一下

如果你喜歡寫.bat檔案

那可以這麼寫

@echo off

:loop

makedata.exe

std.exe

baoli.exe

fc std.

out baoli.out

if not errorlevel 1

goto

loop

pause

:end

平時這樣寫倒是無傷大雅,但問題是考試的時候用的是linux...

於是乎我們可以使用另一種方法

用c++編譯乙個對拍檔案並執行

#include #include 

#include

#include

using

namespace

std;

intmain()

else

}}

對拍的流程和方式基本如此,感覺這麼簡單的玩意也沒啥好說的

哎對...對拍是用來造資料的(大霧

常見C 知識點

1 非c 內建型別 a 和 b,在哪幾種情況下b能隱式轉化為a?a.class b public a b公有繼承自a,可以是間接繼承的 b.class b b實現了隱式轉化為a的轉化 c.class a a實現了non explicit的引數為b 可以有其他帶預設值的引數 建構函式 d.a oper...

C 知識點複習

static static變數只能初始化一次 include include using namespace std void fun int i int main 輸出為 0 00因為static變數只初始化一次,static int value i這句話只執行一次,也就是fun 0 的時候執行。...

C 知識點備忘

關鍵字 explicit不允許隱式的轉化 參考 例如 class string下面兩種寫法編譯通過,是正常的初始化方式 string s2 10 ok 分配10個位元組的空字串 string s3 string 10 ok 分配10個位元組的空字串以下宣告方式為隱式的宣告方式 string s4 1...