C++对拍(Windows+cpp)

C++对拍:Windows+cpp

  • 对拍是何物
  • 对拍的使用
    • 准备材料
    • 随机数据生成器
    • 对拍程序


Welcome to My Blog

对拍是何物

话说对拍,就是一个能帮你检验程序是否正确的程序
End…

对拍的使用

准备材料

  1. 暴力程序或保证能AC的程序一个
  2. 自己的错误程序
  3. 随机数据生成器
  4. 对拍程序一个

随机数据生成器

#include
#include
int main() {
    printf("%lld %lld",1ll*rand()*rand()%1000000001,1ll*rand()*rand()%1000000001);
}

上代码即为A+B Problem的对拍随机数据生成器
为什么有两个rand相乘?
原因:每一个rand最大值只有 32767 32767 32767

对拍程序

代码里写的很详尽了
为了使用更加方便,可以加入一些提示语,如下

#include
#include
#include
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")//为了增加对拍速度,如不能编译,请注释掉Ofast这一句
using namespace std;
string IN,OUT,DATA;
int main()
{
    //For Windows
    //对拍时不开文件输入输出
    puts("请输入被对拍的两个文件名(切记不要开文件输入输出!!!)和数据生成文件(不需要加EXE):");
    printf("数据生成文件:");
    cin >> DATA;
    DATA += ".exe > data.in";
    //这一句的伪代码是:DATA.exe > data.in
    //>在批文件中的意思是把DATA.exe的输出放到data.in中,就可以不开文件输入输出
    printf("你想要提交的(假)AC程序:");
    cin >> IN;
    IN += ".exe < data.in > false.out";
    //同理,<在批文件中的意思是把IN.exe用data.in输入,就可以不开文件输入输出
    printf("暴搜程序或保证能AC的程序:");
    cin >> OUT;
    OUT += ".exe < data.in > true.out";
    //同理
    int k=1e3;
    while(k--)//测试了1000次,应该不会错了吧(如果只是想找数据,可改成while(1)
    {
        system(DATA.c_str());//数据生成器将生成数据写入输入文件
        system(IN.c_str());//获取程序1(假正解)输出
        system(OUT.c_str());//获取程序2(正解)输出
        if(system("fc false.out true.out"))
        {
            //该行语句比对输入输出
            //fc返回0时表示输出一致,否则表示有不同处
            system("pause");//方便查看不同处
            return 0;
            //该输入数据已经存放在data.in文件中,可以直接利用进行调试
        }
    }
}

你可能感兴趣的:(My,OI)