使用平臺
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;
}