对拍
这次不是算法,是一个技巧叫做对拍
概念
对拍,是一个可以提高AC率的方法,思路就是写一份绝对正确的暴力代码,然后用同一份数据测两份代码。如果结果一样那就再测一组新的,不一样就调试正解代码。
实现
首先要写2个cpp文件,分别是你的正解和一份暴力。
然后要写1个bat类型文件和一个数据生成文件(cpp)。
数据生成可以使用rand随机数函数根据题目的输入格式来随机生成每个数字。
bat文件作用是分别测两份代码输入一份数据后的输出,然后比较是否相同。
代码
正解和暴力需要对应各自的题目我这边不展示了,可以看一下bat文件的代码:
g++ gen.cpp -o gen -g -O2
g++ std.cpp -o std -g -O2
g++ bl.cpp -o bl -g -O2
:loop
gen>1.txt
std<1.txt>2.txt
bl<1.txt>3.txt
fc 2.txt 3.txt
if errorlevel 1 pause
goto loop
前3行是编译用的,gen.cpp是你的数据生成文件,std.cpp是你的正解文件,bl.cpp是你的暴力文件
具体编译看这个:g++ 文件名.cpp -o 文件名 -g -O2
后面的loop就是实现对拍的,gen文件生成的数据放进了1.txt,正解从1.txt读入输出放入2.txt,暴力从1.txt读入输出放入3.txt,然后比较2.txt和3.txt是否相同,不同直接结束。
不同时想找到hack数据就直接去1.txt找就好了。
数据生成文件因题而异,比如采药的数据生成如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
srand(time(0));
int n=rand()%1000+1,m=rand()%1000+1;
cout<<n<<" "<<m<<"\n";
for(int i=1;i<=n;i++)
{
int v=rand()%1000+1,w=rand()%1000+1;
cout<<v<<" "<<w<<endl;
}
}
取模运算是考虑数据范围,srand(time(0));加上就行。
这个代码输出的就是数据了。
对拍就是这么做的,还是比较简单的,对拍过程可能会耗费很长时间比赛时让他在后台拍着就行,不用一直看着,对拍要有耐心哈,别就拍了10min就给关了,让它一直拍着反正挂后台就行。

浙公网安备 33010602011771号