对拍数据
在OI赛制中,一般是10组或更多测试点,按照通过测试点百分比得分,10个数据通过1个点就是10分,25个数据通过5个点就是20分。
然而,在考试时只有样例数据可供参考,选手不知道通过样例通过后是否还可以通过其他测试数据。
对拍的应用:
1.选手在比赛中采用一种时间复杂度较低的高分算法,但是不能保证该算法的正确性。因此,先采用朴素算法生成求解程序。(该朴素算法时间复杂度较高,但是编写简单,不容易出错)。然后用高分算法与朴素算法对拍。
2.在线上题库做题时,出现错误,但是没有题解,需要自己对拍一些数据量较小的数据,进行对比。
生成a~b之间的随机整数
#include <bits/stdc++.h>
using namespace std;
int randint(int a, int b){
return rand() % (b - a) + a;
}
int main() {
srand(time(0));
int a, b;
cin >> a >> b;
cout << randint(a, b) << endl;
return 0;
}
在类Unix系统中,rand()返回一个[0,2147483647]之间的整数。 随机数就是一个很大的数据集合,看起来是随机的,但是实际上超出一定范围是循环的。 srand(整数)设置随机种子,如果该整数是不变的,那么每次得到的随机数也是不变的,为了让每次得到的随机数不同,可以使用srand(time(0))。time(0)函数返回自格林尼治标准时间1970年1月1日00:00:00至当前时刻所流逝的秒数。
对拍流程
先让数据生成器输出数据。system("./data > data.in")
然后用这个数据跑一遍暴力代码,输出结果。system("./baoli < data.in > baoli.out")
再用这个数据跑一遍你写的正解代码,输出结果。system("./std < data.in > std.out")
把两个结果相比较,判断是不是一样的。system("diff std.out baoli.out")
举例: 对拍程序
#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <unistd.h>
#include <sys/time.h>
using namespace std;
int main() {
int n = 10, cnt = 0;
struct timeval start, end;
for(int i = 1; i <= n; i++){
system("./data > data.in");
system("./baoli < data.in > baoli.out");
gettimeofday(&start,NULL);
system("./std < data.in > std.out");
gettimeofday(&end,NULL);
int t = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
t = int(t * 1.0 / 1000);
// cout << "t = " << t << endl;
if(system("diff std.out baoli.out"))
printf("测试点#%d Wrong Answer\n", i);
else if(t > 1000){
printf("测试点#%d Time Limited Exceeded,用时%dms\n", i, t);
}
else{
printf("测试点#%d Accepted,用时%dms\n", i, t);
cnt++;
}
sleep(1);
}
printf("最终通过%d个测试点\n", cnt);
return 0;
}
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com