数据对拍
众所周知对拍是一个OIER都应该会的一项技能。
所谓对拍就是生成数据分别给两个程序跑,比较输出是否一致,其中要求一个程序的输出是正确的,这个程序可以写暴力或者爆搜,但必须保证一定是正确的。
那么,对拍一共要用到的程序一共就有四个:
自己想要比较的程序
确保是正确的程序
随机数据生成器
对拍比较器
这里举一个很简单的栗子
比较两个a+b程序
首先是第一个程序
1 //try1 2 #include <iostream> 3 #define M a+b 4 using namespace std; 5 int main() 6 { 7 int a,b,c; 8 cin>>a>>b; 9 c=M; 10 cout<<c; 11 }
然后第二个
1 //try2 2 #include <iostream> 3 using namespace std; 4 int main() 5 { 6 int a,b; 7 cin>>a>>b; 8 cout<<a+b; 9 }
接着是随机数生成器,我们利用rand
这里注意rand的生成的数据范围是2<<16
对待不同的题目需要不同的rand,比如对树,图所需要的rand就不是随随便便rand一个数,而是要对rand处理成一组合法数据。当然这里是最简单的栗子
1 //randdata 2 #include <ctime> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <iostream> 6 using namespace std; 7 int main() 8 { 9 srand(time(0)); 10 int a = rand()%0217; 11 int b = rand()%1112; 12 printf("%d %d",a,b); 13 return 0; 14 }
最后就是我们的对拍程序啦
T的作用是对拍多少组数据。
先生成数据。代码第12行。
这个是这道题的对拍,文件名称根据不同的来。
但是输入的文件就一个,而且要把输入的文件输入到不同的程序里,并产生两个输出文件。代码第13,14行。
这几句背过就行。
1 //try对拍 2 #include <windows.h> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <iostream> 6 using namespace std; 7 int main() 8 { 9 int T = 1000; 10 while(T--) 11 { 12 system("randdata > try.in"); 13 system("try1 < try.in > try1.out"); 14 system("try2 < try.in > try2.out"); 15 if(system("fc try1.out try2.out")) break; 16 } 17 system("pause"); 18 return 0; 19 }
那么程序写完了,如何进行呢?
1.新建一个文件夹,文件夹里面要有:
第一个程序的exe
第二个程序的exe
对拍的exe
生成数据的exe
2.直接运行try对拍.exe
运行结果如下:
文件夹里面的情况:
如果有差异的话:
所以说我们就可以用对拍来检验我们自己所谓的正解是不是真的正解啦~
其实...在考场上的时候,如果你想用对拍,首先你要在1个半小时里写完题目,然后才有时间搞对拍。
其次,就算你对拍跑的数据都是一样的,你也不能保证自己可以AC这道题。毕竟数据不是你自己rand就一定会rand到的,出题人说不定就会用什么奇奇怪怪的数据把你卡掉。
总之俗话说,技多不压身,对拍也不是很难,何乐而不为呢?
隐约雷鸣,阴霾天空,但盼风雨来,能留你在此。
隐约雷鸣,阴霾天空,即使天无雨,我亦留此地。