对拍
主要记一下过程 (下面均来自 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