“对拍器/对数器的使用前提是该题你会暴力解法,如果不会,那么对拍器/对数器也没啥用。”
对拍器/对数器
应用背景
你有一个绝对对的暴力cpp代码,但时间会T,只适用于小范围的数据。所以你写了一个聪明的非暴力cpp代码,但是不知道对不对。
如果非暴力代码是对的,那么在同一份数据上,非暴力代码和暴力代码的结果应该是一样的。根据这个我们就需要一个随机生成数据的mkd.cpp代码了。
工作流程
你手上有三份cpp文件:
std.cpp(非暴力代码)
bl.cpp(暴力代码)
mkd.cpp(随机数据生成代码)
流程为:
mkd生成一份数据A分别输入到std.cpp和bl.cpp中,得到两份输出B和C。对比B和C,如果B和C不一样,那么就查看数据A是什么样子的,然后根据数据A改进std.cpp代码。
实操代码
实操背景:如果这个数是奇数就输出它。
bl.cpp
#include <bits/stdc++.h>using namespace std;int main(int argc, char** argv) {int n = 10;int temp = 0;while(n--){cin>>temp;if(temp&1)cout<<temp<<" ";}cout<<endl;return 0;
}
std.cpp
#include <bits/stdc++.h>
using namespace std;int main(int argc, char** argv) {std::ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);srand(time(0));int n = 10;int temp = 0;while(n--){cin>>temp;if(temp&1)cout<<temp<<" ";}if(rand()%3==0)cout<<"x"<<" ";
// 模拟出错cout<<endl;return 0;
}
mkd.cpp
#include <bits/stdc++.h>using namespace std;int main() {const int n = 10;srand(time(0));int a[n]={0};for(int i = 0;i<n;i++)a[i] = i;random_shuffle(a,a+n); for(int i = 0;i<n;i++)cout<<a[i]<<" ";cout<<endl;return 0;
}
test.bat
g++ std.cpp -o std -g
g++ bl.cpp -o bl -g
g++ mkd.cpp -o mkd -g
:loop
mkd.exe>1.txt
std.exe<1.txt>2.txt
bl.exe<1.txt>3.txt
fc 2.txt 3.txt
if not errorlevel 1 goto loop
pause
goto loop
mkd.exe>1.txt 的意思是把mkd.exe的控制台输出写入到1.txt文件中
std.exe<1.txt>2.txt的意思是1.txt作为std.exe的输入,然后再把输出写入到2.txt中
fc 2.txt 3.txt 比较2.txt和3.txt是否一致
手动点击test.bat文件,它就会快速运行,直到出现2.txt与3.txt的内容不同,这时候mkd会停止生成数据,此时就可以查看1.txt里面的数据,就是std.cpp的WA数据。