关于对拍

1、你需要根据题目的输入要求,用随机函数生成输入文件

2、你需要根据题目写个暴力程序(可以枚举、爆搜等),反正这个暴力程序对时间不要求,但要求答案是正确的

3、你的暴力程序,使用随机生成的输入文件,得到一个暴力的答案;

你的考场写的程序也使用同样的输入文件,也会得到一个输出;

把暴力答案跟你的输出对比,如果不一样则退出,否则输出你的程序的运行时间。

循环以上过程。这个过程叫程序对拍。

在考场上,谁也不知道写出来的代码是否正确,这个时候对拍就非常重要,它可以检测你的代码是否尽可能的正确,当然前提是你的暴力程序不要错。

那随机数据和对拍怎么写呢?参考下面的代码:

datamaker_example.cpp(随机生成的输入)

#include<bits/stdc++.h>
using namespace std;
int main(){
    //https://blog.csdn.net/u012372584/article/details/105182648/
    mt19937 gen(time(0));    
    //std::mt19937是伪随机数产生器,用于产生高性能的随机数。 
    //C++11引入。返回值为unsigned int。
    //使用C++11,需要在 软件的工具 - 编译选项 - 代码生成/优化 - 代码生成 - 语言标准 下拉框选择:ISO c++11
    //软件的工具 - 编译选项  - 编译器 - 在编译时加入以下命令 输入:-std=c++11
    //下面的仅供参考,根据每道题的输入数据格式和范围去生成数据。
    //比如下面的代码生成的对应输入是:
    //输入的第一行是一个整数 n;
    //接下来有 n 个实数 

    uniform_int_distribution<> distint(10,50);//区间可根据需要调整 
    // 产生整数范围的随机数,比如10-50之间的随机整数
    uniform_real_distribution<> distreal(1.0,100.0);//区间可根据需要调整
    // 产生实数范围的随机数,比如1-100之间的随机实数

    int n=distint(gen);
    cout<<n<<'\n';//把产生的 n 输出 
    while(n--){
        //cout<<gen()<<'\n';
        cout<<distreal(gen)<<'\n';
        //把产生的 n个实数 输出 
    }
    return 0;
}

checker_example.cpp(对拍程序)

#include<bits/stdc++.h>
using namespace std;
int main(){
    while(1){
        system("datamaker.exe > 1.in");
        system("baoli.exe < 1.in > bl.out");//把暴力程序运行结果存到bl.out 
        clock_t f=clock();//记录正解程序运行前的时间 
        system("zhenjie.exe < 1.in > zj.out");
        clock_t f1=clock();//记录正解程序运行后的时间 
        if(system("fc bl.out zj.out"))break;
        else {
            double d2=(double)(f1-f)/CLOCKS_PER_SEC;
            cout<<d2<<'\n';//计算并输出正解运行时间 ,单位秒 
        }
    }
    return 0;
}

(——来自小林老师)

0 条评论

目前还没有评论...