关于大型比赛的高级操作那些事儿(?)

· · 个人记录

序言 (高级)

你知道吗?

洛谷早在7102年2017年就推出了CYaRon (大小写字母真难区分呢) 测试数据生成利器了!

你不知道?看看这篇帖子,受益终生啊!(虽然很有可能看不懂)

让我们来翻译一下吧!Yet Another Random Olympic-iNformatics test data generator的意思是……又一个随机奥运信息测试数据生成器 ?

高级!

关于CYaRon,其实涉及到一点Python的东西,文章中也有一个链接(入门指北),其实排开其它不管,Python只要学会点编程语言便看得懂了,而且它是一个很有利于造数据的语言(*/ω\*),而如果用上CYaRon,则会更加方便。

所以这就出现了一个你 可能 看不懂的术语:

什么是对拍?

为此,某蒟蒻用心地研究了这个玩意儿,原来这在大型比赛中是很有用处的啊!

那么,我们来看看大型比赛的高级操作那些事儿吧!

对拍

首先要讲的就是刚刚提到的对拍了!

看着这篇帖子,你应该能想到,这对拍肯定和随机数有点关系。

随机数肿么生成呢?

日报是个好东西:日报#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()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数。

预热部分结束,对拍的正确方法如下:

  1. 对拍是什么呢?

对拍就是你写两个程序,一个是通过暴力作法或网上一篇AC代码的程序,是对的;另一个是你解决问题自己写的程序。 (那么如果你暴力能AC干嘛还要写另外的程序呢?) 我们还需要一个随机数据生成器,然后系统去用这个随机数据生成器的输出作为你这两个程序的输入,然后比较你这两个程序的输出,如果可以找到一组使这两个程序输出不一样的数据,that you will WA!!!(不一定是WA)

  1. 怎么对拍呢?

对拍需要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!)