对拍

鉴于昨天noi赛制不能看分导致我使用了多次对拍,今天来整理一下对拍的知识

预备知识

bash

bash,指的linux常用的shell脚本语言。这个知道最好,不知道也无伤大雅。 bash就是把在terminal中的命令放到一个文件中,便于执行。 bash的文件名一般为*.sh,运行方法为在terminal中,输入命令bash *.sh即可。

c++随机数

我们使用srand()rand()来制造随机数。

#include <bits/stdc++.h>
using namespace std;
int main(){
    srand(time(0));
    cout<<rand()%100;
}

产生一定范围随机数的通用表示公式是:

\([0,n)\)rand()%n;

\([a,b)\)(rand()%(b-a))+a;

\([a,b]\)(rand()%(b-a+1))+a;

\((a,b]\)(rand()%(b-a))+a+1;

shell随机数

for((i=1;i<=100;i++)); 
    do 
	random=$((RANDOM%1000)); 
	echo $random; 
    done

开始

朴素算法|标程

朴素算法即暴力算法,可以自己打,也可以找到题解来进行对拍。 这里为std.cpp

错误算法

错误算法极为你自己的算法。 即为wrong.cpp

数据输出程序

数据产生程序使用随机数来造数据,注意造数据时要符合标准。 这里为data.in

code

sh版:

#!/bin/bash                          
g++ wrong.cpp -o wrong -Wall
g++ data.cpp -o data -Wall
g++ std.cpp -o std -Wall  
while true;do
    ./data>data.in
    ./wrong<data.in>usr.out
    ./std<data.in>std.out
    if diff -b -B -q usr.out std.out;then
        echo "Wonderful!"
    else
        echo "Wrong Answer!"
        break
    fi
done

c++版:

#include <bits/stdc++.h>
using namespace std;
int main(){                      
    system("g++ wrong.cpp -o wrong -Wall");
    system("g++ data.cpp -o data -Wall");
    system("g++ std.cpp -o std -Wall");
    for(int T=1;T<=10000;T++){
        system("./data>data.in");
        system("./wrong<data.in>usr.out");
        system("./std<data.in>std.out");
        if(system("diff -b -B -q usr.out std.out")){
            puts("Wrong Answer");
            return 0;
        }
        else{
            printf("test : %d : Accept",T);
        }
    }
    return 0;
}

到此结束,感谢阅读。

posted @ 2020-06-27 11:50  hyskr  阅读(162)  评论(0编辑  收藏  举报