程序对拍流程

admin 2024-05-07 15:35:03

信息学竞赛中的对拍



需要文件及其含义:

  • 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.exestd.exeme.exe)然后运行对拍脚本就可以了。



【拓展】



Mersenne Twister 算法译为马特赛特旋转演算法,是伪随机数发生器之一,其主要作用是生成伪随机数。此算法是 Makoto Matsumoto(松本)和 Takuji Nishimura(西村)于 1997 年开发的,基于有限二进制字段上的矩阵线性再生。可以快速产生高质量的伪随机数,修正了古老随机数产生算法的很多缺陷。
Mersenne Twister 这个名字来自周期长度通常取 Mersenne 质数这样一个事实。常见的有两个变种 Mersenne Twister MT19937 和 Mersenne Twister MT19937-64 。
Mersenne Twister 有以下优点:随机性好,在计算机上容易实现,占用内存较少(mt19937 的 C 程式码执行仅需 624 个字的工作区域),与其它已使用的伪随机数发生器相比,产生随机数的速度快、周期长,可达到 2^{19937} - 1,且具有 623 维均匀分布的性质,对于一般的应用来说,足够大了,序列关联比较小,能通过很多随机性测试。