- 编程
- 2023-11-25 13:09:17 @
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 条评论
目前还没有评论...