对拍程序 x
一、介绍
在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全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的更多相关文章
- Mac OS下编写对拍程序
介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...
- 手把手教你写对拍程序(PASCAL)
谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...
- 制造测试数据的程序及对拍程序概述(Like CyaRon)
作为一名OIer,比赛时,对拍是必须的 不对拍,有时可以悔恨终身 首先,对拍的程序 一个是要交的程序 另一个可以是暴力.搜索等,可以比较慢,但是必须正确 下面是C++版对拍程序(C++ & c ...
- [转]Linux/Windows下脚本对拍程序
[新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...
- ACM对拍程序
1.把所需对拍的代码的可执行文件a.exe b.exe放在同一目录下 2.把rand数据的代码的可执行文件c.exe放在该目录下 3.新建一个txt文件,里面添加代码,后把格式改成bat @echo ...
- [zt]手把手教你写对拍程序(PASCAL)
谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...
- ACM 中的对拍程序
所谓对拍,就是随机生成数据,然后用一个肯定正确的暴力算法的程序,去测试一个要提交的程序. 由于比赛中一般使用 Linux 系统,所以本篇博客的代码都是 Linux 下的程序代码. 其实最简单的方式是写 ...
- Windows系统对拍程序
Windows系统对拍程序,其中包含c++11用法,请使用c++11标准编译.此对拍程序会在发现错误时显示错误行号以及对应内容,方便比对. 此对拍程序自动使用g++对源代码进行编译.如果出现找不到g+ ...
- linux下的对拍程序
在比赛中我们通常会先打暴力 正解的正确与否,如果数据过大,我们就要用到对拍程序 1 #include<bits/stdc++.h> 2 using namespace std; 3 int ...
随机推荐
- 【FICO系列】SAP ABAP&FI FI/CO接口:待更新的不一致的FI/CO凭证标题数据
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP ABAP&FI ...
- CSU1081有向图BFS
集训队分组 Description中南大学ACM的暑期集训马上就要开始了,这次集训会将全体N名集训队员(编号分别为1, 2, …, N)按集训选拔赛的排名分成两组,前K名队员分入A组,其余队员分入B组 ...
- 只需要2个工具,百度云盘大文件就能用迅雷和IDM下载
不会代码,不懂脚本,没关系 ,能找到一座通往它们的桥梁,照样能到达彼岸. 这里以360极速浏览器为例. 在浏览器地址框输入以下地址直接到达浏览器安装扩展插件的地方(偷个懒,复制网址吧),https:/ ...
- Spring中的常见注解
@Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象. @RestController Spring4之后加入的注解,原来在@Co ...
- CentOS7 内核模块管理
1.查看所有模块:lsmod 2.查看指定模块的详细信息:modinfo 模块名 3.动态加载模块:modprobe 模块名 4.动态卸载模块:modprobe -r 模块名 5.开机自动加载模块:假 ...
- kafka 安装教程
安装详述: https://www.jianshu.com/p/596f107e901a 3.0:运行:cd 到: D:\Installed_software\Professional\kafka_2 ...
- iview报错[Vue warn]: Error in render: "TypeError: ctx.injections.tableRoot.$scopedSlots[ctx.props.column.slot] is not a function"
原因是我使用了iview的<Table>组件,我给Table组件的columns中定义了4个含有slot的列,但是实际在<Table>中只使用了其中3个,导致的报错. 也就是说 ...
- JAVA基础--JAVA 集合框架(泛型、file类)
一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...
- styled-components缺点
缺点 不能用 stylelint 检查你的 Css 代码 在使用 styled-components 的过程中也会遇到一些问题,比如我们的项目会用stylelint来做样式代码的检查,但是使用了 st ...
- JS 的JSON对象
知识点一: 循环对象 for(x in Obj) x表示属性,Obj.x表示属性的值. 修改值 Obj.x = " "//直接修改 删除对象属性 delete Obj.x va ...