答题技巧-对拍

对拍

在OI赛制中,题目按通过测试点数量给分,并且提交代码时没有实时反馈。为尽量检验程序的正确性,可以使用“对拍”。
假设程序1为我们要提交的代码,我们现在用dfs等暴力方法写一个程序2,程序2一般时间复杂度更大。我们随机给出数据范围在程序2之内的多组数据,分别用程序1和2来处理这些数据,检验得到的答案是否相同。

一 编写程序2

一般为dfs或者暴力枚举。

二 在程序1和2中添加读写文档的代码

freopen("input.txt", "r", stdin);
freopen("cpp1/cpp2.txt", "w", stdout);

这两行代码是从input.txt里读入数据,把运行的结果写入cpp.txt。

头文件

#include

三 编写对拍程序

1 编写生成随机数函数

#include
void creat_dataset()
{
	ofstream fout("input.txt");	//把函数产生的随机数写到文件input上
	
	fout.close();
}

加入随机种子

#include
#include
void creat_dataset()
{
	ofstream fout("input.txt");
	int n = rand() % 20 + 1, m = rand() % 1001;
	//  n:  1 ~ 20           m:  0 ~ 1000
	fout << n << " " << m << endl;	//把n, m 写入input
	
	for (int i = 0; i < n; i ++ )
	{
		int v = rand() % 1001, w = rand() % 1001;
		fout << v << " " << w << endl;
	}
	fout.close();
}

2 编写对拍函数

bool work()
{
	creat_dataset();	//调用随机函数
	system("cpp1.exe");	//运行cpp1
	system("cpp2.exe");	//运行cpp2
	return system("fc cpp1.txt cpp2.txt");	
}

fc 可以比较cpp1.txt和cpp2.txt是否相同。
不同则返回1,并且每次比较时会输出两行文字信息:

正在比较cpp1.txt和cpp2.txt
FC: 找不到差异

3 在主函数中调用

int main()
{
	srand(time(0));		//随机种子
	
	for (int i = 0; i < 100; i ++ )
		if (work())
			break;
			
	return 0;
}

当cpp1和cpp2的运行结果不一样时,work会停止运行。
此时input文档中的数据就是通过不了的数据。可以根据此数据完善代码。

你可能感兴趣的:(其他,经验分享)