Linux对拍模板

众所周知,对拍可以有效的判断代码是否正确

一般是以一个暴力的程序(请确保该程序正确)与一个优化的程序来实现

这里以 A+B problem 为例,来说明一下在 Linux 环境下的对拍

这里写图片描述

先在你写程序的文件夹里新建其代码(记得先编译,每次更改操作之后也要重新编译

这里以 a+b 为自己写的代码,std 为暴力代码,data 为生成数据,check 就是对拍程序

这里注意 check 文件的后缀是 .sh,终端编译命令是 sh check.sh,其代码如下

#!/bin/bash
while true; do
    ./data > data.in
    ./std <data.in >std.out
    ./*** <data.in >***.out
    if diff std.out ***.out; then
        printf "AC\n"
    else
        printf "Wa\n"
        exit 0
    fi
done

其中 * * * 代表你所写程序的命名,在我们的样例下就是 a+b,

这里的程序不用打 freopen 也可以使用

首先我们看一下我们建数据的代码 data

#include<ctime>//time需要的函数库
#include<cstdlib>//srand需要的函数库
#include<unistd.h>//sleep需要的函数库
#include<iostream>
using namespace std;
int main()
{
    srand(time(NULL));
    sleep(1);
    //保证随机
    cout<<rand()<<" "<<rand();//输出两个随机数
    return 0;
}

然后我们先写一个错误的 a+b 的代码

#include<iostream>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    if(a>2000000) cout<<a+b+1;
    else cout<<a+b;
    return 0;
}

很显然这个程序在 a 大于2000000的时候会使答案多1,那么我们看一下我们的结果

这里写图片描述

前面的是 std 的运算结果,后面为 a+b 的运算结果

确实和我们期待的一样前面的结果比后面的结果大一

那我们将我们的代码改回正确的代码,结果如下

这里写图片描述

当看到一大片的AC时(希望会有),那么你的优化策略99%是可行的

这时我们就可以Ctrl+Z强行终止我们的 check.sh ,重新进入终端

对拍的模板就讲到这里吧,对拍还是很有用的,能写出暴力的程序建议都对拍一下

最后祝读文的各位 —— 比赛顺利,AC虐场

更新一个好用的Gedit配置,可直接编译运行程序

#!/bin/sh  
cd $GEDIT_CURRENT_DOCUMENT_DIR
gnome-terminal -x bash -c "g++ $GEDIT_CURRENT_DOCUMENT_NAME -Wall -o 1  && ./1;read"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值