對拍,多數據自動生成器

使用平臺

Linux,gcc,g++編譯器

注意事項

記得標程,數據生成器和暴力別出問題了

另外數據生成器中的隨機數改天會去看看的目前來看還是在鴿着的

對拍

註釋版

#include<cstdio>
#include<cstdlib>
#include<sys/time.h>
using namespace std;
#define DEFAULT_NUM 100
#define sec 1000000
int main()
{
    system("g++ maker.cpp -o maker");
    system("g++ std.cpp -o std");
    system("g++ brute.cpp -o brute");
    for(int i = 1;i <= DEFAULT_NUM;i ++)
    {
        struct timeval STD_START,STD_END,MAKER_START,MAKER_END,BRUTE_START,BRUTE_END; //計算時間所需要的結構體

        gettimeofday(&MAKER_START,NULL);
        system("./maker > in");
        gettimeofday(&MAKER_END,NULL);
        long double MAKER_TIME = sec * (MAKER_END.tv_sec-MAKER_START.tv_sec) + MAKER_END.tv_usec - MAKER_START.tv_usec;
        printf("Make data %d : used %.2Lfus\n", i, MAKER_TIME); //造數據的程序計時

        gettimeofday(&STD_START,NULL);
        system("./std < in > sout");
        gettimeofday(&STD_END,NULL);
        long double STD_TIME = sec * (STD_END.tv_sec-STD_START.tv_sec) + STD_END.tv_usec - STD_START.tv_usec;
        printf("Run std in data %d : use %.2Lfus\n", i, STD_TIME); //標程計時

        gettimeofday(&BRUTE_START,NULL);
        system("./brute < in > bout");
        gettimeofday(&BRUTE_END,NULL);
        long double BRUTE_TIME = sec * (BRUTE_END.tv_sec-BRUTE_START.tv_sec) + BRUTE_END.tv_usec - BRUTE_START.tv_usec;
        printf("Run brute in data %d : use %.2Lfus\n", i, BRUTE_TIME);//暴力計時
        
        if(system("diff -Bb sout bout"))
        {
            puts("GG");
            exit(0);
        }
        printf("Passed %d ......\n",i);
        if(MAKER_TIME + STD_TIME + BRUTE_TIME < sec) system("sleep 1"); //如果時間超過1s就可以直接進行下一組數據
    }
    return 0;
}

複製版

#include<cstdio>
#include<cstdlib>
#include<sys/time.h>
using namespace std;
#define DEFAULT_NUM 100
#define sec 1000000
int main()
{
    system("g++ maker.cpp -o maker");
    system("g++ std.cpp -o std");
    system("g++ brute.cpp -o brute");
    for(int i = 1;i <= DEFAULT_NUM;i ++)
    {
        struct timeval STD_START,STD_END,MAKER_START,MAKER_END,BRUTE_START,BRUTE_END;

        gettimeofday(&MAKER_START,NULL);
        system("./maker > in");
        gettimeofday(&MAKER_END,NULL);
        long double MAKER_TIME = sec * (MAKER_END.tv_sec-MAKER_START.tv_sec) + MAKER_END.tv_usec - MAKER_START.tv_usec;
        printf("Make data %d : used %.2Lfus\n", i, MAKER_TIME);

        gettimeofday(&STD_START,NULL);
        system("./std < in > sout");
        gettimeofday(&STD_END,NULL);
        long double STD_TIME = sec * (STD_END.tv_sec-STD_START.tv_sec) + STD_END.tv_usec - STD_START.tv_usec;
        printf("Run std in data %d : use %.2Lfus\n", i, STD_TIME);

        gettimeofday(&BRUTE_START,NULL);
        system("./brute < in > bout");
        gettimeofday(&BRUTE_END,NULL);
        long double BRUTE_TIME = sec * (BRUTE_END.tv_sec-BRUTE_START.tv_sec) + BRUTE_END.tv_usec - BRUTE_START.tv_usec;
        printf("Run brute in data %d : use %.2Lfus\n", i, BRUTE_TIME);
        
        if(system("diff -Bb sout bout"))
        {
            puts("GG");
            exit(0);
        }
        printf("Passed %d ......\n",i);
        if(MAKER_TIME + STD_TIME + BRUTE_TIME < sec) system("sleep 1");
    }
    return 0;
}

多組數據自動生成器

詳細註釋版

#include<cstdio>
#include<ctime>
#include<string>
#include<cstdlib>
#include<sstream>
#include<unistd.h>
#include<sys/time.h>
using namespace std;

string I, ord1, ord2;
stringstream tmp;
string name = "seg";
#define sec 1000000
//sec就是一秒對應的微秒數
int l, r;

int main() 
{
    system("g++ std.cpp -o std"); //編譯標程
    printf("please type the first l and r\n");
    while(scanf("%d%d", &l, &r) == 2) //輸入數據的文件下標範圍
    {
        system("g++ maker.cpp -o maker");//爲了方便改了maker之後直接造數據
        for(int i = l; i <= r; i ++) 
        {
            tmp.clear(),tmp << i,tmp >> I; //將下標i倒序處理以便用來做文件名
            string ord1 = "./maker > " + name + I + ".in";
            string ord2 = "./std < " + name + I + ".in > " + name + I + ".out";
            struct timeval STD_START,STD_END,MAKER_START,MAKER_END; //計算時間所需要的結構體

            gettimeofday(&MAKER_START,NULL);
            system(ord1.data());
            gettimeofday(&MAKER_END,NULL);
            long double MAKER_TIME = sec * (MAKER_END.tv_sec-MAKER_START.tv_sec) + MAKER_END.tv_usec - MAKER_START.tv_usec;
            printf("Make data %d : used %.2Lfus\n", i, MAKER_TIME); //造數據的程序計時

            gettimeofday(&STD_START,NULL);
            system(ord2.data());
            gettimeofday(&STD_END,NULL);
            long double STD_TIME = sec * (STD_END.tv_sec-STD_START.tv_sec) + STD_END.tv_usec - STD_START.tv_usec; //標程計時
            printf("Run std in data %d : use %.2Lfus\n", i, STD_TIME);

            if(MAKER_TIME + STD_TIME < sec) system("sleep 1"); //如果時間超過1s就可以直接進行下一組數據
            for(int j = 1; j <= 10; j ++)
                puts("................");
            printf("Finish Make Data %d\n\n\n", i);
        }
        printf("Data %d to %d is finish\n", l, r);
        printf("please change maker.cpp and then type next l and r\n\n");
    }
    return 0;
}

直接複製版

#include<cstdio>
#include<ctime>
#include<string>
#include<cstdlib>
#include<sstream>
#include<unistd.h>
#include<sys/time.h>
using namespace std;

string I, ord1, ord2;
stringstream tmp;
string name = "seg";
#define sec 1000000
int l, r;

int main() 
{
    system("g++ std.cpp -o std");
    printf("please type the first l and r\n");
    while(scanf("%d%d", &l, &r) == 2) 
    {
        system("g++ maker.cpp -o maker");
        for(int i = l; i <= r; i ++) 
        {
            tmp.clear(),tmp << i,tmp >> I;
            string ord1 = "./maker > " + name + I + ".in";
            string ord2 = "./std < " + name + I + ".in > " + name + I + ".out";
            struct timeval STD_START,STD_END,MAKER_START,MAKER_END;

            gettimeofday(&MAKER_START,NULL);
            system(ord1.data());
            gettimeofday(&MAKER_END,NULL);
            long double MAKER_TIME = sec * (MAKER_END.tv_sec-MAKER_START.tv_sec) + MAKER_END.tv_usec - MAKER_START.tv_usec;
            printf("Make data %d : used %.2Lfus\n", i, MAKER_TIME);

            gettimeofday(&STD_START,NULL);
            system(ord2.data());
            gettimeofday(&STD_END,NULL);
            long double STD_TIME = sec * (STD_END.tv_sec-STD_START.tv_sec) + STD_END.tv_usec - STD_START.tv_usec;
            printf("Run std in data %d : use %.2Lfus\n", i, STD_TIME);

            if(MAKER_TIME + STD_TIME < sec) system("sleep 1");
            for(int j = 1; j <= 10; j ++)
                puts("................");
            printf("Finish Make Data %d\n\n\n", i);
        }
        printf("Data %d to %d is finish\n", l, r);
        printf("please change maker.cpp and then type next l and r\n\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章