对拍用法

比赛中程序正确性判断的方法。

学习来源:yxc

01背包问题为例,使用对拍器验证程序结果。

程序代码

dp写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*dp.cpp*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 1010;

int n, m;
int f[N];

int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++ )
{
int v, w;
scanf("%d%d", &v, &w);
for (int j = m; j >= v; j -- )
f[j] = max(f[j], f[j - v] + w);
}
printf("%d\n", f[m]);
return 0;
}

二进制枚举写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*binary.cpp*/
#include <iostream>
using namespace std;

const int N = 1010;

int n, m;
int v[N], w[N];

int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++ )
scanf("%d%d", &v[i], &w[i]);

int res = 0;
for (int i = 0; i < 1 << n; i ++ )
{
int sumv = 0, sumw = 0;
for (int j = 0; j < n; j ++ )
if (i >> j & 1)
{
sumv += v[j];
sumw += w[j];
}
if (sumv <= m) res = max(res, sumw);
}

printf("%d\n", res);
return 0;
}

对拍器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*cmp.cpp*/
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <ctime>
using namespace std;

int range(int l, int r){
return rand() % (r - l + 1) + l;
}

void generate(){
ofstream fout("input.txt");
int n = 10, m = range(50, 150);
fout << n << ' ' << m << endl;
for (int i = 0; i < n; i ++)
{
int v = range(20, 60), w = range(10, 50);
fout << v << ' ' << w << endl;
}
fout.close();
}

int main(){
srand(time(0));

for(int i = 1; i <= 100; i++)
{
printf("iteration: %d\n", i);
generate();
system("dp.exe < input.txt > dp.txt");
system("binary.exe < input.txt > binary.txt");
system("fc dp.txt binary.txt");
getchar();
}

return 0;
}

用法解释

OI-wiki:对拍是一种进行检验或调试的方法,通过对比两个程序的输出来检验程序的正确性。可以将自己程序的输出与其他程序的输出进行对比,从而判断自己的程序是否正确。

完成两个程序的代码后,写一个对拍器:随机数的生成 + 两个cpp文件的调用 + 比对输出结果。

按题目要求生成随机数

生成一个范围在[l, r] 的整数:

1
2
3
int range(int l, int r){
return rand() % (r - l + 1) + l;
}

Windows 系统下 rand() 返回值的取值范围为$[0, 2^{15}]$。

如果想生成更大的随机数,可以使用rand() << 15 | rand()

结果说明

比对正确时:

比对失败时:(可以去查看input.txt,即为错误样例)