Algorithm|对拍教程-By skyler2003
对拍,是什么呢? 对拍就是你给两个程序,和一个随机数据生成器,然后系统去用这个随机数据生成器的输出作为你这两个程序的输入,然后比较你这两个程序的输出,可以找到一组使这两个程序输出不一样的数据(如果存在的话)
为什么对拍 Noip的赛制中只能提交一次,所以这一次的机会就显得十分珍贵。
你在Noip中写了一个dp,却不知道哪里错了
你会写一个暴力,可是100%会超时
那么,自己再写个数据生成器
然后来一波对拍
就能更加容易发现错误
(方法同适用于许多恶心题[图论等],说不定对拍一下就from 0 to 100了)
怎么,去对拍呢? 首先,新建一个文件夹,
然后,在里面放入biaoda.exe,和test.exe,还有data.exe
biaoda.exe是你暴力写的一个做法或者你从网上找的一份AC代码生成的程序,反正结果肯定是对的。
test.exe就是你的代码生成的程序,你不知道他对不对或者你知道他是WA的但是你不知道哪里WA了,
data.exe就是你的数据生成器,你可以用它去生成你认为的合法数据
对拍程序,要怎么写呢? 本文会同时出示windows和linux的对拍脚本
Windows
:start
gen.exe > data
program.exe < data > program.out
std.exe < data > std.out
@echo %time%
fc program.out std.out
if errorlevel 0 goto startpause
linux
#!/bin/bash
result=0
while [ $result == 0 ];
do
./gen > data
./program < data > program.out
./std < data > std.out
diff -Z program.out std.out
result=$?
echo "Time: $(date)"
doneecho "Target program failed"
# 务必记得: chmod u+x check.sh
数据生成器(data.cpp),要怎么写? 这里我先给个A+B Problem
#include
#include
#include
#include
using namespace std;
int main()
{
srand(time(0));
//生成随机数种子,预防每次生成相同的数据
//但最好加一下下面这句,不然time(0)返回的是秒数要是一秒执行了多次就尬了
//Sleep(1001);
/*Windows下需include,linux下需改为sleep(1001)且需include*/
//srand( (unsigned)time( NULL ) );
int a,b;
a=rand()%100+1,b=rand()%100+1;
printf("%d %d\n",a,b);
return 0;
}
【Algorithm|对拍教程-By skyler2003】如果要手动对拍的话……
#include
#include
using namespace std;
int main(){
srand(time(0));
char ink[15];
for(int i=1;
i<=10;
i++){
sprintf(ink,"shop%d.in",i);
freopen(ink,"w",stdout);
Sleep(1000);
int a=rand()%5000;
int b=rand()%5000;
cout的话请这样:
#include
#include
#include
#include
#include
}
推荐阅读
- 布丽吉特,人生绝对的赢家
- 进必趋|进必趋 退必迟,问起对 视勿移
- 对称加密和非对称加密的区别
- 拍照一年啦,如果你想了解我,那就请先看看这篇文章
- 对抗抑郁最好的方法
- 装聋作哑,关系融洽
- 社保代缴公司服务费包含哪些
- 爷爷睡了
- 数组常用方法一
- 幸福的婚姻不争对错!读《你要的是幸福还是对错》有感。