模板:随机和对拍有关

随机生成整数序列
int a[N];
int random(int x) 
{
	return (ll)rand() * rand() % x;
}
int main()
{
	freopen(".in", "w", stdout);
	srand((unsigned)time(0));
	//生成 n 个范围为 -m ~ m的数 
	int n = random(1000000) + 1;
	printf("%d ", n);
	int m = 1000000;
	for (int i = 1; i <= n; i++)
	{
		a[i] = random(2 * m + 1) - m;
		printf("%d ", a[i]);
	}
	return 0;
}
随机生成区间列
int m, n;
int random(int x)
{
	return (ll)rand() * rand() % x;
}
int main()
{
	freopen(".out", "w", stdout);
	srand((unsigned)time(0));
	//生成 m 个 [1, n] 的子区间 
	sc(n);
	sc(m); 
	for (int i = 1; i <= m; i++)
	{
		int l = random(n) + 1;
		int r = random(n) + 1;
		if (l > r) swap(l, r);
		printf("%d %d\n", l, r);
	}
	return 0;
}
随机生成树
int n;
int random(int x)
{
	return (ll)rand() * rand() % x;
}
int main()
{
	freopen(".out", "w", stdout);
	srand((unsigned)time(0));
	//生成一棵 n 个点的树, 每条边权值为 1e9范围内整数 
	cin >> n;
	for (int i = 2; i <= n; i++)
	{
		int fa = random(i - 1) + 1;
		int val = random(1000000000) + 1;
		printf("%d %d %d\n", fa, i, val);
	}
	return 0;
}
随机生成图
pair <int, int> e[1000005]; //保存数据 
map <pair <int, int>, bool> h; //防止重边 
int n, m;
int random(int x)
{
	return (ll)rand() * rand() % x;
}
int main()
{
	freopen(".out", "w", stdout);
	srand((unsigned)time(0)); 
	//随机生成一张 n 个点 m 条边的无向图,无重边、自环,且必须连通 
	//5 <= n <= m <= n * (n - 1) / 4 <= 1e6
	cin >> n >> m;
	//先生成一棵树,保证连通
	for (int i = 1; i < n; i++)
	{
		int fa = random(i) + 1;
		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 = random(n) + 1;
			y = random(n) + 1;
		}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\n", e[i].first, e[i].second);
	return 0;
}
对拍
int main()
{
	for (int t = 1; t <= 10000; t++)
	{
		//自行设定适当的路径
		system("random.exe"); //随机数据构造
		double st = clock();
		system("group.exe"); //正解
		double ed = clock();
		system("group_1.exe"); //暴力
		if (system("fc group.out group_1.ans"))  
		{
			printf("Wrong Answer");
			return 0;
		}
		else printf("Accepted, 测试点 #%d, 用时 %.0lfms\n", t, ed - st);
	} 
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值