[OI神器]对拍

前言

因为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
#include
#include
#include
#include//必须的头文件
#include
#include
#include
#include
#include
#include
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\n",a,b);
}

当然如果你的暴力实在太慢,这个也没啥用

结语

最后提醒一点
代码都不要打freopen,对拍之前先编译
当然对于我这种只会打暴力的辣鸡,能用的好像并不多

你可能感兴趣的:(技巧,c++,程序设计)