关于大型比赛的高级操作那些事儿(?)
序言 (高级)
你知道吗?
洛谷早在7102年2017年就推出了(大小写字母真难区分呢) 测试数据生成利器了!
你不知道?看看这篇帖子,受益终生啊!(虽然很有可能看不懂)
让我们来翻译一下吧!Yet Another Random Olympic-iNformatics test data generator的意思是……又一个随机奥运信息测试数据生成器 ?
高级!
关于(入门指北),其实排开其它不管,
所以这就出现了一个你 可能 看不懂的术语:
什么是对拍?
为此,某蒟蒻用心地研究了这个玩意儿,原来这在大型比赛中是很有用处的啊!
那么,我们来看看大型比赛的高级操作那些事儿吧!
对拍
首先要讲的就是刚刚提到的对拍了!
看着这篇帖子,你应该能想到,这对拍肯定和随机数有点关系。
随机数肿么生成呢?
日报是个好东西:日报#224期了解一下?
好像关于随机数还有一些日豹来着,大家可以自行寻找啊!但关于随机数,我写过这样一个程序:(为了生成我一道模拟题的数据)
#include<bits/stdc++.h>//万能头文件(误)
using namespace std;
int main()
{
srand((int)time(0));// 产生随机种子,这步不能少!如果没有的话下一次运行也是那几个数
for (int i = 1; i <=10; i++)
{
cout << rand()%100<< " ";//输出在0到99之间的任意一个随机数
}
return 0;
}
在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1,也就是随机数输出会一直为一个数。
不过,rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数。
预热部分结束,对拍的正确方法如下:
- 对拍是什么呢?
对拍就是你写两个程序,一个是通过暴力作法或网上一篇AC代码的程序,是对的;另一个是你解决问题自己写的程序。 (那么如果你暴力能AC干嘛还要写另外的程序呢?) 我们还需要一个随机数据生成器,然后系统去用这个随机数据生成器的输出作为你这两个程序的输入,然后比较你这两个程序的输出,如果可以找到一组使这两个程序输出不一样的数据,that you will WA!!!(不一定是WA)
- 怎么对拍呢?
对拍需要4份文件,除了以上讲到的3份,我们还需要一个批处理程序。
批处理程序的扩展名是.bat,记事本写好以后将.txt变为.bat就可以实现手动写批处理程序。
步骤0: 把你的AC程序和自己编写的程序和随机数据生成程序准备好。
步骤1:桌面创建一个记事本(SO EASY!!!)。 步骤2:在你的记事本中敲入这样一段文字(比较复杂,我写了注释) 步骤3:将记事本格式转换为.bat(文件夹搜索选项中的隐藏扩展名一般是开的,先把它关掉才能显示扩展名哦)
下面举个简单的栗子吧!(滑稽)
如AC代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
自己的代码如下:
#include <stdio.h>
int main(){
int a,b;
for(int i=1;i<=1;i++){
scanf("%d%d",&a,&b);
}
printf("%d", a+b);
return 0;
}
(再次手动滑稽)
随机数生成代码见上例,再改改就行。(某蒟蒻:这里是因为作者太懒不想敲代码又想推销一下顺带整蛊而已,各位大佬敬请谅解)
还有对拍.bat见上例。
将三个程序依次编译,将三个exe,和对拍.bat一起放在一个文件夹下,然后点击对拍.bat即可。
这个时候你发现这样的页面:
正在比较文件(自己写的程序名).out和(AC代码名大写的).OUT
FC:找不到差异
恭喜,你大概可以说是AC了!
但如果你发现变成这样:(虽然我提供的代码不太可能是这样)
正在比较文件(自己写的程序名).out和(AC代码名大写的).OUT
***** (自己写的程序名).out
0
***** (AC代码名(大写)).OUT
1
*****
这就说明你WA了!!!
我们可以看看(随机数据生成器名).in中数据为:
-1 2
那你就可以根据这个数据来调试自己到底哪儿错了,以便再次AC。
真是太好用了呢!!!
(对了你们知道这是Windows的对拍而不是Linux的吗,Linux实在有点儿特殊)
总之就是这样滴:
进入下一趴!
输入输出测试器
其实刚刚对拍里面的批处理程序有点儿像,但为什么要单独讲讲它呢?
因为很多大比赛都在用这个测试选手程序啊!
虽然这个比较官方,但是我们自己出的题可以先拿输入输出测试器来测试啊!(其实真的不需要对拍,对拍可以是在“战场”上用的)
再把这张图片拿粗来: 再来看看输入输出测试器的呢: 其实最大的不同还是在于:一个的样例是程序运行得出的,另一个的样例是程序提前运行得出的,存在IN、OUT文件里(大雾)。
总结起来就是这样的:
艾玛真香
CSP大魔王!!!(误)
现在的比赛,不有备而考是真的会挂(误),本人这次差点儿挂了。
(素质三连之滑稽)
正片:
我们还是来回顾一下kkksc03的这篇文章吧!
所以说,RP++是最重要的!!! 有备而靠才是最关键的!不要忘记自己的初心,继续奋进!加油,奥利给明年的CSP,我们携手共进!!!(LOVE!)