对拍
鉴于昨天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;
}
到此结束,感谢阅读。