ACM程序对拍

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

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

两个进行对拍的程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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;
}

  数据生成器程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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”,双击运行即可。

1
2
3
@echo off
fc 1.txt 2.txt
pause

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

若有差异,显示为

 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//生成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 表示输入结束

数据生成器可写成如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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; 

 

posted @   zxzhang  阅读(524)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示