火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

【linux】如何写对拍

作者: 作者的头像   huolong , 时间:2023-09-30 08:41:10 , 所有人可见, 阅读  35

对拍数据

在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

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码