信息学竞赛中的对拍
需要文件及其含义:
-
in.cpp
:产生输入数据的源文件; -
std.cpp
:标程,即能产生正确数据但是会超时的源文件; -
me.cpp
:检查的程序,即用于提交但是不确定对不对(所以拿来对拍)的源文件; -
run.bat
:对拍脚本。
以下为一组示例:
run.bat
@echo off :loop in.exe > in.txt me.exe < in.txt > me.txt std.exe < in.txt > std.txt fc me.txt std.txt if not errorlevel 1 goto loop pause【注意】上面的.cpp文件都需要生成.exe文件后再运行.bat文件
run.cpp
#include<bits/stdc++.h> using namespace std; int main(){ while(true){ system("in.exe > in.txt"); system("me.exe < in.txt > me.txt"); system("std.exe < in.txt > std.txt"); if( system("fc me.txt std.txt")){ system("type in.txt"); break; } } return 0; }
in.cpp
#include <bits/stdc++.h> using namespace std; mt19937 rng(time(NULL)); int random(int a, int b) { return rng() % (b - a + 1) + a; } int main() { int a = random(1, 100), b = random(1, 100); cout << a << " " << b << endl; return 0; }
std.cpp
#include <bits/stdc++.h> using namespace std; int main() { int a, b; cin >> a >> b; cout << a + b << endl; return 0; }
me.cpp
#include <bits/stdc++.h> using namespace std; int main() { int a, b; cin >> a >> b; if (a + b > 130) cout << "hehe" << endl; else cout << a + b << endl; return 0; }
编译三个源文件生成对应的目标文件(in.exe
、std.exe
、me.exe
)然后运行对拍脚本就可以了。
【拓展】
Mersenne Twister 算法译为马特赛特旋转演算法,是伪随机数发生器之一,其主要作用是生成伪随机数。此算法是 Makoto Matsumoto(松本)和 Takuji Nishimura(西村)于 1997 年开发的,基于有限二进制字段上的矩阵线性再生。可以快速产生高质量的伪随机数,修正了古老随机数产生算法的很多缺陷。
Mersenne Twister 这个名字来自周期长度通常取 Mersenne 质数这样一个事实。常见的有两个变种 Mersenne Twister MT19937 和 Mersenne Twister MT19937-64 。
Mersenne Twister 有以下优点:随机性好,在计算机上容易实现,占用内存较少(mt19937 的 C 程式码执行仅需 624 个字的工作区域),与其它已使用的伪随机数发生器相比,产生随机数的速度快、周期长,可达到
,且具有 623 维均匀分布的性质,对于一般的应用来说,足够大了,序列关联比较小,能通过很多随机性测试。
Mersenne Twister 这个名字来自周期长度通常取 Mersenne 质数这样一个事实。常见的有两个变种 Mersenne Twister MT19937 和 Mersenne Twister MT19937-64 。
Mersenne Twister 有以下优点:随机性好,在计算机上容易实现,占用内存较少(mt19937 的 C 程式码执行仅需 624 个字的工作区域),与其它已使用的伪随机数发生器相比,产生随机数的速度快、周期长,可达到