对拍和随机数据生成


对拍

// 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);
原文地址:https://www.cnblogs.com/tztqwq/p/13761618.html