对拍
// Windows系统对拍程序
#include<cstdlib>
#include<cstdio>
#include<ctime>
int main() {
for (int T = 1; T <= 10000; T++) {
// 自行设定适当的路径
system("C:\random.exe");
// 返回当前程序已经运行的CPU时间,windows下单位ms,类unix下单位s
double st = clock();
system("C:\sol.exe");
double ed = clock();
system("C:\bf.exe");
if (system("fc C:\data.out C:\data.ans")) {
puts("Wrong Answer");
// 程序立即退出,此时data.in即为发生错误的数据,可人工演算、调试
return 0;
}
else {
printf("Accepted, 测试点 #%d, 用时 %.0lfms
", T, ed - st);
}
}
}
随机数据生成
main 函数内内容
srand((unsigned)time(0));
生成 0~N
整数
int rnd(int N) {return rand()*rand()%N;}
生成 l~r
整数
int rnD(int l,int r) {return l+rnd(r-l+1);}
生成随机树
for(int i=2; i<=n; ++i) {
int fa = rnD(1,i-1);
int val = rnD(minval, maxval);
printf("%d %d %d
", i, fa, val);
}
生成随机图
要求无向, 联通, 不含重边、自环
pair<int, int> e[1000005]; // 保存数据
map< pair<int, int>, bool > h; // 防止重边
// 先生成一棵树,保证连通
for (int i = 1; i < n; i++) {
int fa = rnD(1,i);
e[i] = make_pair(fa, i + 1);
h[e[i]] = h[make_pair(i + 1, fa)] = 1;
}
// 再生成剩余的 m-n+1 条边
for (int i = n; i <= m; i++) {
int x, y;
do {
x = rnD(1,n), y = rnD(1,n);
} while (x == y || h[make_pair(x, y)]);
e[i] = make_pair(x, y);
h[e[i]] = h[make_pair(y, x)] = 1;
}
// 随机打乱,输出
random_shuffle(e + 1, e + m + 1);
for (int i = 1; i <= m; i++)
printf("%d %d
", e[i].first, e[i].second);