对拍是怎么回事呢?对拍相信大家都很熟悉,但是对拍是怎么回事呢,下面就让小编带大家一起了解吧。

对拍是用来检验自己写的正解的正确性&效率的东西。

操作说明:

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))

这就是关于如何对拍的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!