算法竞赛进阶指南 0x70 综合技巧与实践

算法竞赛进阶指南 0x70 综合技巧与实践

0x71 C++ STL

0x72 随机数据生成与对拍

NOIP 复赛 必备 能力

随机数据生成与对拍 简单实践 如下

P1177 【模板】快速排序

https://www.luogu.org/problemnew/show/P1177可提供在线测评

bf:brute force 暴力,朴素解法

bf.cpp bf.exe

//冒泡排序 暴力 枚举
#include <stdio.h>
#define maxn 100100
int a[maxn];
int main(){
    int n,i,j,t;
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    for(i=1;i<=n;i++)//自小到大排序
        for(j=i+1;j<=n;j++)
            if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t;
    for(i=1;i<=n;i++)printf("%d ",a[i]);
    return 0;

}

sol:solution 正解 准备提交测评的程序

sol.cpp sol.exe

#include <stdio.h>
#define maxn 100100
int a[maxn];
void quicksort(int left,int right){
    int i=left,j=right,mid=a[(left+right)/2],t;
    while(i<=j){
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j)t=a[i],a[i]=a[j],a[j]=t,i++,j--;
    }
    if(i<right)quicksort(i,right);
    if(left<j)quicksort(left,j);
}
int main(){
    int n,i;
    freopen("data.in","r",stdin);
    freopen("data.ans","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    quicksort(1,n);
    for(i=1;i<=n;i++)printf("%d ",a[i]);
    return 0;

}

random:随机数据生成程序

random.cpp random.exe

//生成 整数 序列
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define maxn 100
#define maxa 1000000000
int random(int n){
    return (long long)rand()*rand()%n;
}
int main(){
    int n,i;
    freopen("data.in","w",stdout);
    srand((unsigned int)time(0));
    n=random(maxn)+1;//数据个数n
    printf("%d\n",n);
    for(i=1;i<=n;i++)printf("%d ",random(maxa)+1);
    printf("\n");
    return 0;
}
 

test:Windows 系统对拍程序

test.cpp test.exe

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int i;
    double st,ed;
    for(i=1;i<=1000;i++){
        system("random");
        st=clock();
        system("sol");
        ed=clock();
        system("bf");
        if(system("fc data.out data.ans")){
            printf("Wrong Answer! %d\n",i);
            return 0;
        }else
            printf("Accepted,测试点 #%d, 用时%.0lfms\n",i,ed-st);
    }
    return 0;
}

生成四个可执行文件

bf.exe sol.exe random.exe test.exe

放在同一个文件夹内

算法竞赛进阶指南 0x70 综合技巧与实践

在cmd 运行 test.exe

以下为程序运行情况

算法竞赛进阶指南 0x70 综合技巧与实践

文件夹会生成三个文件 data.in data.out data.ans

算法竞赛进阶指南 0x70 综合技巧与实践

2018-4-11