一、介绍

  在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA。那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案。

  所谓“对拍”,顾名思义,就是让两者相互比对。所谓“两者”,一是你要测试的程序,二是一个答案在该程序在一定范围(时间/空间)内结果必定正确的程序(一般是用暴力求解的程序)

  两个程序准备好编译好了以后,就可以开始准备测试用的输入样例了。但是输入样例要是人为准备起来的话肯定浪费时间还费脑,更别提在正式比赛的时候了。人脑靠不住,那就靠电脑。

  为了让测试的样例更全面,我们可以用伪随机数的方法。我们需要用到这几个高贵妖艳的头文件:

#include <cstdio>

#include <ctime>

#include <cstdlib>

  在高中数学的统计知识中学过的随机抽样,可以用随机数表法选取一些随机的数值。在生成随机数时也是用这个原理。首先利用srand()函数在随机数表中找一个点,作为取随机数的起始点。但是如何做到每次选不同的起始点来取数呢?时间是一直在变化的,所以用time(0)取系统时间放入srand()函数中去,每次取的起始点都不一样。如果用固定值的话,每次取得的随机数都会是一样的

  接下来,就按照输入格式用rand() 函数将输入样例的每个变量赋随机值。考虑到输入数据的范围问题,若在0~n的范围内,rand()%n就可以使随机数范围控制在0~n内了;若是在1~n内,因为随机数下限为0,所以rand()%(n-1)+1就把随机数控制在了该范围内。以此类推,若在m~n(m<=n)范围内,生成随机数的公式就为rand()%(n-m)+m

  最后将变量严格按输入格式输出就好了,后续步骤可以把输出的数据添加到 .in文件里。

  有了相比对的程序,有了随机数生成器,现在就差一个“发动机”兼“处理机”了。

  为了进行多次对拍以及处理对拍程序输出的异同,我们需要一个程序可以进行给定次数下的对拍,并且在有结果不同时停止。写这个程序时需要用到这个奇淫的头文件:

#include <windows.h>

  首先我们要人为规定进行对拍的次数,在这里我就先规定 t = 100,即进行100次对拍。然后在一层while(t--)的循环里进行对拍。在循环里层,我们需要把随机数生成器生成的数据通过奇技淫巧加入 .in文件里,然后将 .in文件分别通过奇技淫巧交给两个程序运行,最后比对两个程序 .out文件的内容,若相同,则继续下一次对拍,若不同,则停止对拍注意要把所有.exe文件放在同一个文件夹中,运行对拍程序即可

二、程序举例

a+b prob.

force.cpp

#include <cstdio>

int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return ;
}

force2.cpp

#include <cstdio>

int main()
{
int a,b;
scanf("%d%d",&a,&b);
while(b--) a++;
printf("%d\n",a);
return ;
}

data.cpp

#include <cstdio>
#include <ctime>
#include <cstdlib> using namespace std; int main()
{
srand(time());
int a,b;
a=rand(); b=rand();
printf("%d %d",a,b);
return ;
}

duipai.cpp

#include <cstdio>
#include <windows.h> using namespace std; int main()
{
int t=;
while(t--)
{
system("data>a+b.in");
system("force<a+b.in>force.out");
system("force2<a+b.in>force2.out");
if(system("fc force.out force2.out")) break;
}
system("pause");
return ;
}

高精度加法 prob.

  gjd_ac.cpp

#include<cstdio>
#include<cstring> char num1[],num2[];
int sum[],a[],b[]; int main()
{
int i=,j=,len1=,len2=,temp=;
bool flag=false,flag2=false; gets(num1);
len1=strlen(num1);
for(i=,j=len1-; i<len1,j>=; i++,j--)
a[j]=num1[i]-''; gets(num2);
len2=strlen(num2);
for(i=,j=len2-; i<len2,j>=; i++,j--)
b[j]=num2[i]-''; if(len2>len1) len1=len2;
for(i=; i<=len1; i++)
{
sum[i]=a[i]+b[i]+temp;
temp=;
if(sum[i]>=)
{
temp++;
sum[i]=sum[i]%;
}
}
for(i=len1; i>=; i--)
{
if(sum[i]==&&flag2==false) flag=false;
else
{
flag=true;
flag2=true;
}
if(flag==true)printf("%d",sum[i]);
}
if(flag==false)printf("");
return ;
}

gjd_wa.cpp

#include <iostream>
#include <cstring> using namespace std; char a[],b[];
int aa[],bb[],sum[]; int main(void)
{
cin>>a;
int i,lena=strlen(a);
for(i=; i<lena; i++)
aa[lena--i]=a[i]-''; cin>>b;
int lenb=strlen(b);
for(i=; i<lenb; i++)
bb[lenb-i-]=b[i]-''; if(lena>lenb) lenb=lena;
int temp=;
for(i=; i<lenb; i++)
{
sum[i]=aa[i]+bb[i]+temp;
temp=sum[i]/;
sum[i]%=;
}
while(temp>)
{
sum[lenb]+=temp%;
temp/=;
}
if(sum[lenb]!=)lenb+=;
bool flag=false;
for(i=lenb-; i>=; i--)
{
if(sum[i]==&&flag==false)continue;
if(sum[i]!=)flag=true;
cout<<sum[i];
}
if(flag==false)cout<<'';
return ;
}

dat.cpp

#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <iostream> using namespace std; int main()
{
srand(time());
int lena=rand()%;
int lenb=rand()%;
for(int i=; i<lena; i++) printf("%d",rand()%);
printf("\n");
for(int i=; i<lenb; i++) printf("%d",rand()%);
return ;
}

duip.cpp

#include <cstdio>
#include <windows.h> using namespace std; int main()
{
int t=;
while(t--)
{
system("dat>gjd.in");
system("gjd_ac<gjd.in>gjd_ac.out");
system("gjd_wa<gjd.in>gjd_wa.out");
if(system("fc gjd_ac.out gjd_wa.out")) break;
}
system("pause");
return ;
}

转自:大佬

End.

对拍程序 x的更多相关文章

  1. Mac OS下编写对拍程序

    介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...

  2. 手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  3. 制造测试数据的程序及对拍程序概述(Like CyaRon)

    作为一名OIer,比赛时,对拍是必须的 不对拍,有时可以悔恨终身 首先,对拍的程序 一个是要交的程序 另一个可以是暴力.搜索等,可以比较慢,但是必须正确 下面是C++版对拍程序(C++ & c ...

  4. [转]Linux/Windows下脚本对拍程序

    [新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...

  5. ACM对拍程序

    1.把所需对拍的代码的可执行文件a.exe b.exe放在同一目录下 2.把rand数据的代码的可执行文件c.exe放在该目录下 3.新建一个txt文件,里面添加代码,后把格式改成bat @echo ...

  6. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  7. ACM 中的对拍程序

    所谓对拍,就是随机生成数据,然后用一个肯定正确的暴力算法的程序,去测试一个要提交的程序. 由于比赛中一般使用 Linux 系统,所以本篇博客的代码都是 Linux 下的程序代码. 其实最简单的方式是写 ...

  8. Windows系统对拍程序

    Windows系统对拍程序,其中包含c++11用法,请使用c++11标准编译.此对拍程序会在发现错误时显示错误行号以及对应内容,方便比对. 此对拍程序自动使用g++对源代码进行编译.如果出现找不到g+ ...

  9. linux下的对拍程序

    在比赛中我们通常会先打暴力 正解的正确与否,如果数据过大,我们就要用到对拍程序 1 #include<bits/stdc++.h> 2 using namespace std; 3 int ...

随机推荐

  1. 【MM系列】SAP 财务帐与后勤不一致情况

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 财务帐与后勤不一致情况   ...

  2. 函数参数中经常见到的*args和**kwargs

    在python中,这两个是python中的可变参数,*arg表示任意多个无名参数,类型为tuple;**kwargs表示关键字参数,为dict. 例如下面这个代码可以利用*args计算传入的n个数的平 ...

  3. 4.站点克隆wget----隐写术图片----backbox linux

    站点克隆wget sudo bash cd Desktop/Cloned wget -h clear wget -mk https://help.ubuntu.com/ 隐写术图片 想想朋友圈的图片 ...

  4. jenkins初级使用篇

    1.jenkins的初级使用 1.1 介绍 创建一个项目 可以看到当前登陆用户及用户权限 可以查看到所有构建过的项目的历史 系统管理 My Views:视图功能,我们可以自己创建一个自己的视图 系统管 ...

  5. mysql 登录和退出 和简单得操作命令

    {} 是必须要有得,[]是可有,可没有得... SHOW WARNINGS (查看警告信息) SHOW CREATE DATABASE T1; (查看数据得创建sql语句)

  6. 简单的遍历xml

    #include <opencv2\opencv.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv ...

  7. PDFObject的使用(转)

    1.pdfobject.js官网:https://pdfobject.com/ 2.在html文件中引入这个文件,以pdfobject.min.js为例 1 <script type=" ...

  8. 列表and元组操作

    一.列表  列表是我们以后比较常用的数据类型之一,通过列表我们可以实现对数据的存储.修改等操作. 首先,我们看一下列表的定义: 有了列表以后,我们可以通过下标来访问列表中的元素.注意:下表是从0开始的 ...

  9. 目标检测(三) Fast R-CNN

    引言 之前学习了 R-CNN 和 SPPNet,这里做一下回顾和补充. 问题 R-CNN 需要对输入进行resize变换,在对大量 ROI 进行特征提取时,需要进行卷积计算,而且由于 ROI 存在重复 ...

  10. jQuery之样式的类操作

    方法:添加类addClass    .删除类removeClass. 切换类toggleClass <style> div { width: 150px; height: 150px; b ...