前言
因为NOI系列赛制的毒瘤,很多人都没有真正展现自己的实力。(本校tly,wk大佬痛失Au )
而对拍,通过对比你造的数据,看你两份不同代码跑出来的结果,可以调错。能缓解这一问题。不过自己造的数据用那个垃圾随机数,数据都比较水
有的人就说了:“我打不来正解只会暴力那你这有啥用呢?”
答:对比不同的的暴力代码看暴力打错没有
实现
对拍程序
建一个txt文件,后缀名改为bat,进行编辑
一般来说对拍程序放在源代码那个文件夹,免得还要多写源代码位置
然后背就完事了
@echo off
:loop
生成数据代码名.exe > 数据名.in
AC代码名.exe < 数据名.in > AC.out
WA代码名.exe < 数据名.in > WA.out
fc AC.out WA.out
if not errorlevel 1 goto loop
pause
goto loop
基本就是这个格式
然后再放一个真正可以运行的代码
@echo off
:loop
3.exe > 1.in
2.exe < 1.in > AC.out
1.exe < 1.in > WA.out
fc AC.out WA.out
if not errorlevel 1 goto loop
pause
goto loop
稍稍解释一下
第一行关掉输入显示,避免一些无意义的东西
第二行就是一个标记点,loop你想改成啥就改成啥(后面一并要改)
fc是一个比较函数
errorlevel是一个返回值,如果不一样就是1,否则是0。
不一样就暂停了,一样继续对拍
数据生成
这东西说简单也简单,说难也难,要看到底是什么题目。有些题数据确实挺难生成的
反正记住srand(time(0))
就对了
但是有一种好像比较高端的操作,用windows自带的随机数,这样的好处是生成数据更快,而不是一秒一次
而原来的对拍程序要加一个%random%
生成数据代码名.exe %random% > 数据名.in
生成数据的代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<sstream>//必须的头文件
#include<algorithm>
#include<queue>
#include<map>
#include<queue>
#include<set>
#include<ctime>
using namespace std;
stringstream s1;
int main(int argc,char *argv[]){
int seed = time(0);
if (argc > 1){
s1.clear();
s1 << argv[1];
s1 >> seed;
}
srand(seed);
//前面不能修改,特别是参数
int a = rand();
int b = rand();
printf("%d %d
",a,b);
}
当然如果你的暴力实在太慢,这个也没啥用
结语
最后提醒一点
代码都不要打freopen,对拍之前先编译
当然对于我这种只会打暴力的辣鸡,能用的好像并不多