实战技巧--对拍
yzh老师在清北学堂最后一天教的对拍:
-
创建一个文件夹
-
将你要对拍的源代码copy进去(例:test.cpp)
-
将你写好且确定无误的暴力代码也放进去,注意两者名字要有所区别(例:test__.cpp)
-
搞一个生成数据的代码(例: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",n);
For(i,1,n) printf("%lf %lf\n",(rand()%200+100)/100.0,(rand()%200+100)/100.0);
}
这段代码能生成n行每行两个大于1,
且在1~3之间的高精浮点数
(佬师太喜欢用宏定义了)
- 最后撸个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\n",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;
}