实战技巧--对拍

yzh老师在清北学堂最后一天教的对拍:

  1. 创建一个文件夹

  2. 将你要对拍的源代码copy进去(例:test.cpp)

  3. 将你写好且确定无误的暴力代码也放进去,注意两者名字要有所区别(例:test__.cpp)

  4. 搞一个生成数据的代码(例:mkdata.cpp)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#define For(i,l,r) for(int i=l;i<=r;i++)
int main(){
	freopen("coin.in","w",stdout);
	srand(time(0));
	int n = 1000; 
//	printf("%d
",n);
	For(i,1,n) printf("%lf %lf
",(rand()%200+100)/100.0,(rand()%200+100)/100.0);
}

这段代码能生成n行每行两个大于1,

且在1~3之间的高精浮点数
(佬师太喜欢用宏定义了)

  1. 最后撸个bat脚本
:loop
	mkdata
	test
	test__
	fc test.out test__.out
	if errorlevel == 1 pause
goto loop

loop表示循环,然后是你要打开的.exe

所以注意,在打开脚本前我们一定要先运行一遍代码生成.exe。

fc是用来文件比较,

若有不符它就会暂停输出行字,具体还请读者实现。


UPDATE 4.27:

  • 生成区间:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;
int random(int n)//生成1-n的随机整数 
{
	return (long long)rand()*rand()%n+1;
}
int main()
{
	freopen("1poker2.out","w",stdout); 
	srand((unsigned)time(0));
	int n=random(100); 
	int m=random(100);//询问次数 
	cout<<n<<endl;
	for(int i=1;i<=n;i++){
		cout<<random(50)<<' ';
	}
	cout<<endl;
	cout<<m<<endl;
	for(int i=1;i<=m;i++)
	{
		int l=random(n);
		int r=random(n);
		if(l>r)swap(l,r);
		printf("%d %d
",l,r);
	}
	fclose(stdout);
	return 0;
}
  • 生成图
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <utility>
#include <map>
#include <ctime>
using namespace std;
pair<int ,int> e[100005];
map<pair<int,int>,bool>h;
int random(int x){
	return (long long )rand()*rand()%x;
}
int main()
{
	freopen("data.in","w",stdout);
	int n,m;
	srand((unsigned)time(0));
	n=random(1000);
	while(m<n-1)m=random(100005);
	cout<<n<<' '<<m<<endl;
	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;
	}
	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(y,x)]);
		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++){
		cout<<e[i].first<<' '<<e[i].second<<endl;
	}
/*	int s=random(n)+1,t=random(n)+1,k=random(100)+1;
	cout<<s<<' '<<t<<' '<<k<<endl;*/
	fclose(stdout);
	return 0;
}
原文地址:https://www.cnblogs.com/Rye-Catcher/p/8962706.html