关于对拍

相信大家都听说过对拍。

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

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

所谓对拍,是将你的程序跑出的答案与正确程序进行比较。具体方法是先写一个程序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", 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.

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

posted @ 2018-12-04 15:00  IXIS  阅读(473)  评论(1编辑  收藏  举报