对拍详细使用方法
对拍的作用
对于我们在学校OJ,cf,牛客…各种只提供少量测试数据的题目,常常交上代码常常超时,能写出正确的暴力代码而题目要求的时间复杂度更低。然而这时你写出了能通过样例且时间复杂度更低的代码,但交上去就是错误。
这时对拍会帮助你找到错误代码和正确暴力代码之间的区别。
对拍需要4个基本文件,数据产生代码,暴力正确代码,测试代码,对拍代码,并把4个文件放在同一个文件夹里。
现在以最简单的 a + b a+b a+b 问题为例,输入两个数输出两数之和。
数据产生代码
我们找到错误代码和正确暴力代码之间的区别就需要跑数据产生结果,对比结果的差距:
// data.cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{struct _timeb T;_ftime(&T);srand(T.millitm);freopen("in.txt", "w", stdout); //生成 使两份代码 将要读入的数据int a = rand(), b = rand();cout<<a<<' '<<b<<'\n';
}
暴力正确代码
暴力正确代码文件产生暴力正确代码程序供对拍时使用
// baoli.cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{freopen("in.txt", "r", stdin); //读入数据产生代码造出来的数据freopen("baoli.txt", "w", stdout); //输出暴力正确答案int a, b, ans = 0;cin>>a>>b;for (int i = 1; i <= a; i++)ans++;for (int i = 1; i <= b; i++)ans++;cout<<ans<<'\n';
}
测试代码
测试代码文件产生测试代码程序供对拍时使用
// std.cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{freopen("in.txt", "r", stdin); //读入数据产生代码造出来的数据freopen("std.txt", "w", stdout); //输出答案int a, b;cin>>a>>b;cout<<a+b<<'\n';
}
对拍代码
对拍代码调用 数据产生程序,测试程序,暴力正确程序,输出不正确的数据
// duipai.cpp
#include <iostream>
#include <cstdio>
#include <windows.h>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{int ok = 0;int n = 10;for (int i = 1; i <= n; ++i){system("data.exe"); //运行数据产生程序system("std.exe"); //运行测试程序double begin = clock(); //计时system("baoli.exe"); //运行暴力正确程序double end = clock();double t = (end - begin);if (system("fc std.txt baoli.txt")){int aa,bb;cin>>aa>>bb;cout<<aa<<' '<<bb<<"\n\n"; printf("测试点#%d Wrong Answer\n", i);}else if (t > 1000) //1秒{printf("测试点#%d Time Limited Exceeded 用时 %.0lfms\n", i, t);}else{printf("测试点#%d Accepted 用时%.0lfms\n", i, t);ok++; //AC数量+1}}printf("\n");double res = 100.0 * ok / n;printf("共 %d 组测试数据,AC数据 %d 组。 得分%.1lf。", n, ok, res);
}
对拍结果
按照上述步骤产生的运行结果如下:
修改data.cpp如下
#include <bits/stdc++.h>
using namespace std;
int main()
{freopen("in.txt", "r", stdin); //读入数据产生代码造出来的数据freopen("std.txt", "w", stdout); //输出答案int a, b;cin>>a>>b;int su = a + b;if(su%2)cout<<su<<'\n';elsecout<<su-1<<'\n';
}
运行结果如下: