Loading

对拍

主要记一下过程 (下面均来自 Loceaner)

首先需要这几样东西

一定正确的暴力程序(baoli.cpp)

等待验证的“正解”(std.cpp)

生成数据的程序(rand.cpp)

对拍,检查的程序(checker.bat)

然后我们运行baoli.cpp,std.cpp,得到两个exe文件,再新建一个a.in文件,作为它们共同的文件输入源。准备好这7个文件后,我们运行checker.bat,即可进行对拍。

以 P3378 为例

baoli.cpp

暴力写法

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e6 + 10;
inline int read() {
	char c = getchar(); int x = 0, f = 1;
	while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
	while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
	return x * f;
}
int N;
int st[MAXN], l, r;

int main() {
	freopen("a.in", "r", stdin);
	N = read();
	l = 1; r = 0;	
	while(N--) {
		int opt = read();
		if(opt == 1) {
			int x = read();
			st[++r] = x;
		} else if(opt == 2){
			sort(st + l, st + r + 1);
			printf("%d\n", st[l]);
		} else {
			sort(st + l, st + r + 1);
			l++;
		}
	}
	return 0;
}

std.cpp

//使用优先队列
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
inline int read() {
	char c = getchar(); int x = 0, f = 1;
	while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
	while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
	return x * f;
}
int N;
priority_queue<int, vector<int>, greater<int> >q;
int main() {
	freopen("a.in", "r", stdin);
	N = read();
	int tot = 0;
	while(N--) {//O(n)
		int opt = read();
		if(opt == 1) {
			int x = read();
			q.push(x);
			tot++;
		} else if(opt == 2){
			if(tot == 0) {
				puts("gg");
				return 0;
			}
			printf("%d\n", q.top());
		} else {
			if(tot == 0) {
				puts("gg");
				return 0;
			}
			q.pop();
		}
	}
	return 0;
}

rand.cpp

就是生成数据的程序

#include<bits/stdc++.h>
#include<ctime>
using namespace std;
int rnd() {
	return rand() << 15 | rand();
}
int tot;
int main() {
	freopen("a.in", "w", stdout);
	srand((unsigned)time(0));
	int N = (rand() % 30) + 1;//[1, 30]
	cout << N << '\n';
	while(N--) {
		int opt = rand() % 3 + 1;//[1, 3]
		if(opt == 3 && tot == 0) opt = 1;
		if(opt == 2 && tot == 0) opt = 1;
		cout << opt << ' ';
		if(opt == 1) {
			int x = rnd();
			cout << x << '\n';
			tot++;
		} else if(opt == 2){
			cout << '\n';
		} else {
			tot--;
			cout << '\n';
		}
	}
	return 0;
}

freopen函数中的文件名可以自己定,但需要与baoli.cpp和std.cpp的文件输入名相同(在示例中,fopen函数的文件名必须为a.in)

checker.bat

其实我们并非只能用checker.bat,也可以直接编写cpp文件

下面的是.bat文件的编写,文件名因程序而异

baoli.exe > b.out 指的是baoli.exe运行之后生成b.out文件

同理std.exe > c.out 指的是std.exe运行之后生成c.out文件

然后是进行对比,看有没有差别两文件的内容有差别就会自动停止

注意生成的是 bat 文件

:loop
 rand.exe
 baoli.exe > b.out
 std.exe > c.out
 fc b.out c.out
 if not errorlevel 1 goto loop
pause
posted @ 2020-12-13 07:36  Dita  阅读(81)  评论(0编辑  收藏  举报