对拍程序
原理
数据生成器:data.exe
暴力解法(标程):brute.exe
待测程序:solve.exe
data生成数据到data.in
solve从data.in读取数据计算输出到data.out
brute从data.in读取数据计算输出到data.ans
最后比对data.ans和data.out 内容是否一致
用system()来调用Windows控制台命令
“<“是从文件读取输入信息
“>”将当前命令输出覆盖重定向
“fc”对比两个文件,相同返回0
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int test=(int)1e3;
for (int i=1;i<=test;i++) {
system("data > data.in");
printf("Test %d:\n",i);
clock_t st=clock();
system("solve < data.in > data.out");
clock_t ed=clock();
double tim=(double)(ed-st)/CLOCKS_PER_SEC*1000;
printf(" Time:%.0fms\n",tim);
system("brute < data.in > data.ans");
if (system("fc data.ans data.out")) {
break;
}
}
return 0;
}
数据生成
随机数种子
/*
*这种方式产生的随机数种子1s才会变一次
*所以如果数据量比较小的话
*一次生成多组数据测试比较好
*/
srand((unsigned)time(NULL));
随机数
rand()返回一个[0,RAND_MAX]区间内的整数, RAND_MAX 取决于编译器和操作系统,Windows下通常是0x7fff,Linux下是0x7fff ffff。
大多数时候,我们需要更大的随机数,可以把两个rand()简单乘起来,得到一个范围 [0,RAND_MAX* RAND_MAX ]的随机数生成器,尽管这样不能等概率取到区间内的所有数。
/*
*生成一个[0,n-1]内的随机数
*对1e9以内的n都可以很好的工作
*/
int random(int n)
{
return (long long)rand()*rand()%n;
}
随机树
/*
*生成一个n个节点的随机树
*权值范围为[1,1e9]
*2到n的每个节点向[1,i-1]内的随机一个节点连一条边
*/
for (int i=2;i<=n;i++) {
int fa=random(i-1)+1;
int val=random((int)1e9)+1;
printf("%d %d %d\n",fa,i,val);
}