对拍程序 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 ...
随机推荐
- python实例1-找质数/素数
质数定义:质数(prime number)又称素数.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 示例解决方案1 有很多方法可以解决这个问题,下面是一些例子:这是一个不同的功能分解 ...
- mysql源码包安装
一.准备编译环境 # yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake # wget ht ...
- 2019JAVA第二次实验报告
Java实验报告 班级 计算机科学与技术二班 学号 20188442 姓名 吴怡君 完成时间 2019/9/19 评分等级 实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方 ...
- 第十四周总结&实验报告八
实验八 实现一个简单的记事本操作,有菜单项的 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo ...
- express接受ajax的发送post请求
两种常用的方式: $.ajax({ type: "POST", url: '/everdayPost', // data: JSON.parse({cont:data}),注意: ...
- 由于;引发的Oracle的BadSqlExecption
一.在使用单引号进行各种转换合并的时候发生的异常: 1:首先单引号的表示符为 ' 在Oracle中如果SQL语句带上了分号是会报错的, 在SQL传入进行执行的时候会报BadSQLExecption,这 ...
- python中session的使用
- NOI-LINUX
先把配置背过吧: (set-background-color "gray15")(set-foreground-color "gray")(global-lin ...
- javascript xml转json
1.代码 //加载xml数据 function loadXml(str) { if (str == null) { return null; } var doc = str; try{ doc = c ...
- mysqldump: [Warning] Using a password on the command line interface can be insecure.
MySQL 5.6 警告信息 command line interface can be insecure 修复 在命令行输入密码,就会提示这些安全警告信息. Warning: Using a pas ...