对拍

本文详细介绍了一种编程竞赛中常用的对拍技巧,通过对比标准答案和自己编写的代码的输出,来找出潜在的bug。以POJ3347为例,展示了如何使用C++实现对拍过程,包括主函数、标答代码、个人代码以及随机数生成器的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对拍,以 POJ 3347 为例。

题解链接

对拍方法如下:

//主函数代码 文件名任意
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
    int t=200;
    while(t--)
    {
        cout<<t<<endl;
        system("random.exe > random.txt");
        system("biaoda.exe < random.txt > biaoda.txt");
        system("wode.exe < random.txt > wode.txt");
        if(system("fc wode.txt biaoda.txt"))
        {
            //如果出现结果不同的情况,执行以下代码
            //样例数据会存到random.txt中
            cout<<t<<endl;
            break;
        }
    }
}
//标答 文件名为 biaoda
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
typedef long long ll;
using namespace std;
const int N=100010;
int s[110],t[110];
int main()
{
    int n;
    //对拍时就别多组输入了
    scanf("%d",&n);
    //while(scanf("%d",&n)&&n)
    //{
        for(int i=1;i<=n;i++)
            scanf("%d",&s[i]);
        for(int i=1;i<=n;i++)
        {
            t[i]=s[i];
            for(int j=1;j<i;j++)
            {
                t[i]=max(t[i],t[j]+2*min(s[j],s[i]));
            }
        }
        for(int i=1;i<=n;i++)
        {
            int l=0,r=0;
            for(int j=1;j<i;j++)
            {
                if(s[j]>s[i])
                    l=max(l,s[j]+s[i]-(t[i]-t[j]));
            }
            for(int j=i+1;j<=n;j++)
            {
                if(s[j]>s[i])
                    r=max(r,s[j]+s[i]-(t[j]-t[i]));
            }
            if(l+r<2*s[i])
                printf("%d ",i);
        }
        printf("\n");
    //}
    return 0;
}
//我的代码,文件名为 wode
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
typedef long long ll;
using namespace std;
const int N=100010;
double s[110],t[110];
int main()
{
    int n;
    //对拍时就别多组输入了
    scanf("%d",&n);
    //while(scanf("%d",&n)&&n)
    //{
        for(int i=1;i<=n;i++)
            scanf("%lf",&s[i]);//s[i]为正方形边长的sqrt(2)倍
        s[0]=0;t[0]=0;
        double inf=0;
        for(int i=1;i<=n;i++)
        {
            t[i]=s[i]/2;
            for(int j=1;j<i;j++)
                t[i]=max(t[i],t[j]+min(s[j],s[i]));
            inf=max(inf ,t[i]+s[i]/2);
        }
        for(int i=1;i<=n;i++)
        {
            double l=inf,r=0;
            for(int j=1;j<i;j++)
            {
                if(s[j]>s[i])
                    r=max(r,t[j]+s[j]/2);
            }
            for(int j=i+1;j<=n;j++)
            {
                if(s[j]>s[i])
                    l=min(l,max(t[j]-s[j]/2,double(0)));
            }
            /*
            正确代码:
            if(l<=t[i]-s[i]/2||r>=t[i]+s[i]/2||r>=l)
                continue;
            else
                printf("%d ",i);
            */
            if(r>=l)
                continue;
            else
                printf("%d ",i);
        }
        printf("\n");
    //}
    return 0;
}

 

//随机数代码 名文件称为 random
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
const int N=100010;
using namespace std;
int a[1000010];
int random(int n)
{
    return (long long)rand()*rand()%n;
}
int main()
{
    srand((unsigned)time(0));
    int n=random(5)+1;
    /*
    尽管题目要求是n最大为50,但是我不想n太大,
    太大的数据不容易找到错误,所以此处我让n最大为5
    */
    int m=30;
    for(int i=1;i<=n;i++)
    {
        a[i]=random(m+1);
        if(a[i]==0)
            a[i]++;
    }
    cout<<n<<endl;
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值