zoukankan      html  css  js  c++  java
  • 关于对拍

    相信大家都听说过对拍。

    如果没听说过也假装听说过吧

    那么对拍是用来干什么的呢?

    所谓对拍,是将你的程序跑出的答案与正确程序进行比较。具体方法是先写一个程序make来生成数据,再使用一个一定正确,但是不限制时间、空间复杂度的程序(暴力一般是可以保证正确性的)生成正确答案,然后再和你的程序运行出来的答案进行比较。你的程序有各种BUG,这个一般都可以产生错误数据供调试需要。

    当然,想要对拍,数据生成是必须的(不然你拿什么拍)

    这个时候我们便用到了随机数。

    随机数的主要函数就是srand(time(0))和rand()

    调用它需要头文件ctime和algorithm

    比如我们现在要造一个需要我们排序的数据,即:

    第一行输出一个n(n<=1000)

    第二行输出n个整数,即每个数为a[i](a[i]<=1000000)

    代码如下:

    #include <ctime>
    #include <cstdio>
    #include <algorithm>
    #define MAXN 1000007
    using namespace std;
    bool vis[MAXN];//标记 
    int main(){
        freopen("IXIS.in","w",stdout);//不需要输入,只需要将数据输出到指定in文件中,此in文件将是std.cpp与my.cpp的输入文件 
        srand(time(0));
        int n = rand() % 1000 + 1;//若rand出的数大于自己想要的范围,%一下 
        printf("%d
    ", n); 
        for(int i = 1; i <= n; i++){
            int p = rand() % 1000000 + 1;//同义 
            while(vis[p]) p = rand() % 1000000 + 1;//这里保证了p之前没有出现过即保证数不重复 
            printf("%d ", p); 
        }
        return 0;
    }

    那么接下来就是你要对拍的两个程序

    //手写快速排序
    #include <map>
    #include <queue>
    #include <string>
    #include <vector> 
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define LL long long
    #define MAXN 1000007
    const int N = 1 << 21;
    using namespace std;
    int read() {
        int x = 0, f = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9') ch = getchar();
        while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
        return x * f;
    }
    void print(int x) {
        if(x < 0) putchar('-'), x = -x;
        if(x > 9) print(x / 10);
        putchar(x % 10 + '0');
    }
    int getMax(int a[], int n) {
        int maxn;
        maxn = a[0];
        for(int i = 1; i < n; i++)
            if(a[i] > maxn) maxn = a[i];
        return maxn;
    }
    void countSort(int a[], int n, int exp) {
        int output[n];
        int buckets[10] = {0};
        for(int i = 0; i < n; i++)
            buckets[(a[i] / exp) % 10 ]++;
        for(int i = 1; i < 10; i++)
            buckets[i] += buckets[i - 1];
        for(int i = n - 1; i >= 0; i--) {
            output[buckets[(a[i] / exp) % 10] - 1] = a[i];
            buckets[(a[i] / exp) % 10]--;
        }
        for(int i = 0; i < n; i++) a[i] = output[i];
    }
    
    void radixSort(int a[], int n) {
        int exp, maxn = getMax(a, n);
        for(exp = 1; maxn / exp > 0; exp *= 10)
            countSort(a, n, exp);
    }
    int n, a[MAXN];
    int main() {
        freopen("IXIS.in", "r", stdin);
        freopen("IXIS.my", "w", stdout); 
        n = read();
        for(int i = 0; i < n; i++) a[i] = read();
        radixSort(a, n);
        for(int i = 0; i < n; i++)
            print(a[i]), printf(" ");
        return 0;
    }
    //STL
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define MAXN 1007
    using namespace std;
    int a[MAXN], n;
    int main(){
        freopen("IXIS.in", "r", stdin);
        freopen("IXIS.std", "w", stdout);
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
        sort(a + 1, a + 1 + n);
        for(int i = 1; i <= n; i++) printf("%d ", a[i]);
        return 0;
    }

    而对拍,这里只讲bat(才不是因为我不会qwq

    代码为:

    :loop
      maker.exe//生成数据的cpp弹出来的小黑框
      std.exe//STL的cpp弹出来的小黑框
      my.exe//手写快排的cpp弹出来的小黑框
      fc IXIS.std IXIS.my//两个程序的输出文件
      if %errorlevel%==0 goto loop//如果输出相同就一直进行下去
    pause

    emmm,记得到时候用的时候删掉后面的注释,否则,,会出现错误

    因为这不是cpp的,所以不能放在dev中使用,其正确使用过程如下

    1.建一个TXT文本文档(其实别的也可以啦,只要不是文件夹就行啦qwq)

    2.将这个文本文档的后缀改为.bat

    3.将这个文档用记事本打开,将代码贴进去

    4.关闭,保存

    5.双击,运行

    如若两个程序输出没有不同则一直运行,若不同,停止运行,而此时IXIS.in里的数据为令两个程序输出不同的数据

    若相同:

    切它会一直疯狂的对比。

    若不同:

    有时候,在某些网站是下不了数据的,那么你就可以复制一篇题解(交上去)同你的程序对拍。

    然后就会拍出你跑不过去的数据

    OK,class is over.

    我最讨厌不讲理的人了,但如果是你,撒个娇就好了。

  • 相关阅读:
    adb在查询数据库中遇到的问题及解决【1】
    软工人3月9日学习
    软工人3月8日学习
    Android studio ListView的数据更新问题
    python将爬取数据存储到文本文件
    Android studio ListView的数据更新问题
    Android studio ListView之checkbox错位问题解决
    阅读笔记《人月神话》1
    android打包生成apk
    线性布局和相对布局
  • 原文地址:https://www.cnblogs.com/GTBD/p/10064153.html
Copyright © 2011-2022 走看看