对拍是怎么回事呢?对拍相信大家都很熟悉,但是对拍是怎么回事呢,下面就让小编带大家一起了解吧。
对拍是用来检验自己写的正解的正确性&效率的东西。
操作说明:
1.准备好自己写的暴力(b.cpp 和 b.exe)和正解(z.cpp 和 z.exe)。
2.写一个造数据的程序(shuju.cpp 和 shuju.exe),根据题目要求自己造。
3.写一个对拍程序(duipai.cpp 和 duipai.exe),大部分情况下不用改动,如下.
#include<bits/stdc++.h>
using namespace std;
long long i;
int main()
{
while(1)
{
system("shuju.exe > shuju.txt");
double t1=clock();
system("b.exe < shuju.txt > b.txt");
double t2=clock();
system("z.exe < shuju.txt > z.txt");
double t3=clock();
if(system("fc b.txt z.txt"))break;
cout<<"AC: "<<++i<<" "<<t2-t1<<" "<<t3-t2<<endl;
}
return 0;
}
注意要将上面那些东西放到同一个目录下。
4.运行duipai.exe.
例子
下面举一个简单的例子,以a*b problem为例。
z.cpp
#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main()
{
cin>>a>>b;
cout<<a*b;
return 0;
}
b.cpp
#include<bits/stdc++.h>
using namespace std;
int a,b,ans;
int main()
{
cin>>a>>b;
for(int i=1;i<=b;++i)ans+=a;
cout<<ans;
return 0;
}
duipai.cpp
#include<bits/stdc++.h>
using namespace std;
long long i;
int main()
{
while(1)
{
system("shuju.exe > shuju.txt");
double t1=clock();
system("b.exe < shuju.txt > b.txt");
double t2=clock();
system("z.exe < shuju.txt > z.txt");
double t3=clock();
if(system("fc b.txt z.txt"))break;
cout<<"AC: "<<++i<<" "<<t2-t1<<" "<<t3-t2<<<endl;
}
return 0;
}
shuju1.cpp 用来检验效率
#include<bits/stdc++.h>
#define YY ((rand()<<14)|rand())
using namespace std;
int main()
{
srand(time(0));rand();
cout<<YY%10+1<<" "<<YY%100000000+1;
return 0;
}
shuju2.cpp 用来检验正确性
#include<bits/stdc++.h>
#define YY ((rand()<<14)|rand())
using namespace std;
int main()
{
srand(time(0));rand();
cout<<YY%1000000+1<<" "<<YY%1000000+1;
return 0;
}
注意事项:
1.4个程序都要放到同一个目录下
2.对拍的文件名不要取名fc
3.windows下和linux下生成的随机数范围不一样
4.生成数据的文件不要忘记写srand(time(0))
这就是关于如何对拍的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!