}
但是,rand() 函数的数据范围是 \(0\le rand() \le 32767\) (windows 环境中)。
想要生成大数,可以使用四个 rand() 相乘获得。
想要限制数据范围,可以用取模的性质实现,有这样的公式:
\[0+k\le rand() \bmod (m+1) +k \le m+k
\]
生成一些区间,一棵树,一个图,一条链的方法看这里。
制作评测程序
windows 的控制台命令可以让我们在外部控制 .exe 文件的输入输出,语法如下:
A.exe > Aout.txt 表示运行相对路径下的可运行程序 A.exe 并将其输出放到同一目录下的 Aout.txt 文件中(没有会自行创建)。
A.exe < Ainput.txt > Aout.txt 表示运行 A.exe 并将 Ainput.txt 作为输入数据(此文件必须存在),其输出放到同一目录下的 Aout.txt 文件中(没有会自行创建)。
fc Aout.txt Bout.txt 表示对 Aout.txt 和 Bout.txt 进行全文比对,如果有不同返回 true,相同返回 false。
以上三条控制台命令在 C++ 中可以用 system() 函数执行,即:
system("A.exe > Aout.txt");
system("A.exe < Ainput.txt > Aout.txt");
system(fc Aout.txt Bout.txt);
于是评测程序的一般步骤为:
运行数据生成文件 rans.exe,将输出放到 in.txt 文件中作为输入数据。
以 in.txt 为数据运行暴力程序 std.exe 并将其返回的正确答案放到 stdans.txt 文件中。
以 in.txt 为数据运行自己的程序 div.exe 并将其返回的正确答案放到 ans.txt 文件中。此过程中可以计算时间,空间等。
全文比较 stdans.txt 和 ans.txt 根据返回值判断正误并返回时间,空间等信息。
可以写出这样的代码:
int main(){
system("rans.exe > in.txt");//数据
system("std.exe < in.txt > stdans.txt");//暴力计算答案
system("div.exe < in.txt > ans.txt");//自己的程序计算答案
if(system("fc stdans.txt ans.txt")){//全文比较,判断正误
cout<<"Wrong Answer"<<'\n';
}
else{
cout<<"Accepted"<<'\n';
}
}
在外面套一个循环就可以不停对拍了。
关于时间空间计算
在调用自己写的程序前使用 clock() 函数获取浮点数时间,同样在调用后也获取一次,两者相减就是程序所用的时间,单位为 ms。
示例:
double beg=clock();
system("addit.exe < in.txt > ans.txt");
double ends=clock();
...
cout<<"Accepted "<
看空间的方法暂时没找到qwq。
迁移自洛谷