在编写的cpp文件及暴力求解文件中,通过freopen
函数重定向输入输出流(freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的)。
输入:freopen("***.***", "r", stdin)
输出:freopen("***.***", "w", stdout)
运用rand()
函数生成随机数据,例如:
#include<cstdlib> //加入这个包才能使用随机函数rand() #include<cstdio> #include<ctime> //加入这个包就能以时间为种子初始化随机函数 #include<iostream> using namespace std; int main() { freopen("data.in","w",stdout); //注意:该程序生成的数据到data.in中 srand(time(NULL)); //重要:初始化随机函数,以时间为种子 int n=rand()%10000+1; //生成一个1到10000之间的随机整数n int m=rand()%10000+1; printf("%d %d\n",n,m); for(int i=1;i<=n;i++)printf("%d ",rand()%20000-rand()%10000);//生成-10000到10000间的数字 printf("\n"); for(int i=1;i<=m;i++) { int x=rand()%n+1; //保证生成的数据是x<=y int y=x+rand()%n+1; if(y>n)y=n; printf("%d %d\n",x,y); } } //注意: //rand()只能生成0到32767之间的随机整数,如果要生成1到50000之间的整数,可以写成: //rand()%30000+rand()%20000+1
如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> int main() { for(int T = 1; T <= 1000; T++) { //自行设定适当的路经 system("D:/C/ACM/牛客比赛/小白月赛34/A/rand.exe"); //当前程序已经运行的CPU时间,Window下单位为ms,Unix下单位为s double st = clock(); system("D:/C/ACM/牛客比赛/小白月赛34/A/A.exe"); double ed = clock(); system("D:/C/ACM/牛客比赛/小白月赛34/A/baoli.exe"); if(system("fc a.out baoli.out")) { //程序立即退出,此时a.in中的数据即为错误数据 puts("Wrong Answer"); return 0; } else printf("Accepted, 测试点 #%d, 用时 %.01fms\n", T, ed - st); } return 0; }
文件后缀改为.bat, 程序如下:
:loop rand.exe baoli.exe > baoli.out A.exe > a.out fc baoli.out a.out if not errorlevel 1 goto loop pause
直接运行程序,如果输出不一样,程序终止,此时的A.in文件中的数据即为出错的数据。
只有对拍文件不一样,如下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> int main() { for(int T = 1; T <= 1000; T++) { //生成的可执行文件没有后缀 system("./rand"); double st = clock(); system("./A"); double ed = clock(); system("./baoli"); //此处的fc改为diff if(system("diff a.out baoli.out")) { puts("Wrong Answer"); return 0; } else printf("Accepted, #%d, cost %.01fms\n", T, ed - st); } return 0; }