有时候在OJ刷题目的时候,总是会遇到不知名bug,题目总不能AC,自己测试的一些数据又都能得出正确的结果,又或是直接暴力会TLE,改了算法,但是仍然WA,这时候进行程序对拍测试数据不失为一个好办法。程序对拍主要是通过数据生成器生成随机数据,然后与正确程序跑出来的结果进行比对,虽然有时候数据很难构造,但是对于一般的题目却能起到很到的作用。

通过一个简单的例子进行解释:求两个数之和。

两个进行对拍的程序

#include<stdio.h>

int main()
{
	freopen("data.txt","r",stdin);  //从文件读入数据
	freopen("1.txt","w",stdout);    //写出数据到文件
	int a,b;
	while (~scanf("%d%d",&a,&b))
	{
		printf("%d+%d=%d\n",a,b,a+b);
	}
	return 0;
} 

#include<stdio.h>

int main()
{
	freopen("data.txt","r",stdin);  //从文件读入数据
	freopen("1.txt","w",stdout);    //写出数据到文件
	int a,b;
	while (~scanf("%d%d",&a,&b))
	{
		printf("%d+%d=%d",a,a,a+a);
	}
	return 0;
}

  数据生成器程序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<limits.h>
int main()
{
	freopen("data.txt","w",stdout);    //随机数据生成写入到此文件
	srand(time(NULL));
	int n = 100;        //数据规模
	while (n--)
	{
		printf("%d %d\n",rand()%INT_MAX,rand()%INT_MAX);
	}
	return 0;
}

  

  重要的一步:在保存数据的位置新建一个txt文本文件,输入如下内容,并把“.txt”的后缀名改为“.bat”,双击运行即可。

@echo off
fc 1.txt 2.txt
pause

  二者结果若无差异,显示为

若有差异,显示为

几种常用的数据生成程序:

//生成int型数据
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<time.h>
int main()
{
    freopen("data.txt", "w", stdout);
    srand(time(NULL));
    //通过控制t的大小控制产生数的范围,控制n可以控制数据的产生量。
    int t, n = 1000;
    while(n--)
    {
        printf("%d\n",rand()%t);
    }
    return 0;
}

//生成两位小数数据
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<time.h>
int main()
{
    freopen("data.txt", "w", stdout);
    srand(time(NULL));
    int n = 1000;
    while(n--)
    {
        printf("%.2lf\n",rand()*1.0/100);
    }
    return 0;
}

//生成字符串
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<time.h>
int main()
{
    freopen("data.txt", "w", stdout);
    srand(time(NULL));
    int t, n = 1000;
    while(n--)
    {
        printf("%c\n",rand()%26 + 'A');
    }
    return 0;
}

  

最后再通过一个例子加深对数据生成器的理解,假设有一组输入数据如下:

  • IN x(0=<x<1000000000)表示队伍最后面新来了一个饥饿值为 x 的同学
  • OUT 表示队伍最前面的同学打饭结束离开队伍(若无人则跳过该操作)
  • QUERY
  • END 表示输入结束

数据生成器可写成如下:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<time.h>
const int maxn = 1000000000;
int main() {
    freopen("data.txt", "w", stdout);
    srand(time(NULL));
    //通过控制t的大小控制产生数的范围,控制n可以控制数据的产生量。
    int t = 3,n = 7000;
    while (n--)
    {
    	if (rand()%t+1 == 1)
    	{
    		printf("IN %d\n",rand()%maxn);
    	}
    	else if (rand()%t + 2 == 2)
    	{
    		printf("OUT\n");
    	}
    	else if (rand()%t + 3 == 3)
    	{
    		printf("QUERY\n");
    	}
    }
    printf("END");
    return 0;
}

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

  1. 多个程序对sql server中的表进行查询和插入操作导致死锁

    最近在做一个项目,是要用多个程序对sql server中的相同的数据库进行操作(查询和插入),所以在开始的时候常会出现死锁问题,后来在网上进行了咨询,发现了一些解决方法,留作大家参考: 并发去操纵一张 ...

  2. JAVA程序对MYSQL数据库加锁实验

    什么是脏读,不可重复读,幻读 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据. 2. 不可重 ...

  3. ACM数据对拍程序

    #include<cstdio> #include<cstdlib> #include<ctime> int main() { long s,t; while(1) ...

  4. 结合自己的程序对thinkphp模板常量的理解

    先上个图,有时候路径很多,没理解会搞混,看手册的说明 页面login.html模板的访问路径为http://www.tp.com/index.php/admin/Manager/login,测试他的常 ...

  5. 编写一个程序对Largest函数进行测试,找出一组数据的最大值

    源程序代码: import java.util.Scanner; public class findmax { public static void main(String[] args) { // ...

  6. 用程序对hdfs进行操作。

    调试加安装了半天,怎么也没有配置好怎么通过Eclipse直接连接hdfs,最后我还是打成一个jar包放到Linux虚拟机中运行的. 运行命令Java -jar  XXX.jar. 当中对hdfs的操作 ...

  7. 使用java程序对oracle添加触发器时,报错:索引中丢失 IN 或 OUT 参数:: 1

    解决方法: 执行sql语句时,使用java.sql.Statement代替java.sql.PreparedStatement. java.sql.PreparedStatement ps = con ...

  8. 201671010127 2016—2017-2 通过一个小程序对Java的再认识。

    学习了将近四周的Java语言,对于Java语言,我也有了更进一步的理解,出于对Java语言的喜爱,我总是喜欢没事的时候,自己敲一些很简单的代码,一边学习Java语言,一边对比C语言,往往可以帮助我们更 ...

  9. Linux网卡驱动程序对ethtool的支持和实现

    Linux 的一个显著特点就是其强大的网络功能,Linux 几乎支持所有的网络协议,并在这些协议基础上提供了丰富的应用.对 Linux 网络管理的重要性不言而喻,这些管理依赖于网络工具,比如最常用的 ...

随机推荐

  1. Linux中sudo配置

    Linux下的sudo及其配置文件/etc/sudoers的详细配置. 1.sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的ro ...

  2. 74 partprobe-磁盘管理

    partprobe命令用于重读分区表,当出现删除文件后,出现仍然占用空间.可以partprobe在不重启的情况下重读分区. 语法 partprobe (选项) (参数) 选项 -d:不更新内核: -s ...

  3. 搭建企业内部yum仓库(centos6+centos7+epel源)

    搭建自己的yum仓库,将自己制作好的rpm包,添加到自己的yum源中. yum仓库服务端配置如下 : 1. 创建yum仓库目录 mkdir -p /data/yum_data/cd /data/yum ...

  4. Sublime Text 3前端开发常用优秀插件介绍

    . 首页 博客园 联系我 前言:关于Sublime Text 3. Package Control插件管理. Package Control使用方法/安装Emmet插件. Emmet插件. JsFor ...

  5. 在Ubuntu 14.04安装Nginx

    ###介绍 Nginx是世界上最流行的网络服务器中的一种,负责托管网络上一些流量最高的网站.在多数情况下,Nginx比Apache在资源上更加友好,可以作为网络服务器或反向代理服务器. 这篇教程中,我 ...

  6. (转)ElasticSearch学习

    ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引 ...

  7. 【转】Web前端浏览器兼容初探

    原文地址:http://blog.jobbole.com/38638/ 前言 浏览器兼容是前端开发人员必须掌握的一个技能,但是初入前端的同学或者其他后台web开发同学往往容易选择忽略,而形成两个极端: ...

  8. python 中的sort 和java中的Collections.sort()函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

  9. eclipse中maven install和build,clean

    eclipse插件,m2eclipse 1.maven install相当于maven原生的命令: mvn install 2.aven build是 m2eclipse这个插件自己创造的概念,需要你 ...

  10. 使用HTML来生产Android界面

    使用HTML来生产Android界面 (2013-03-11 17:50:39) 转载▼   分类: Android 1. HTML 开发软件界面   因为android软件开发分工目前还没有细化,程 ...