关于对拍

知周所众,对拍是一个在比赛中重要的技能之一。

所以,我自制了一个建议的对拍程序,简洁实用(Windows环境)。

原理

对拍原理大致如下:

数据生成器(generator)->程序1->输出1

数据生成器(generator)->程序2->输出2

输出1-对拍-输出2
            |WA
            v
      保存数据

怎么样,我手敲的流程图好不好看?

代码实现

generator:(根据具体题目修改随机数范围和数量)

#include<iostream>
#include<cstdlib>
#include<ctime>
int main()
{
std::srand(std::time(nullptr));
int n=std::rand()%5000+1,m=std::rand()%5000+1;
std::cout<<n<<" "<<m<<std::endl;
return 0;
}

随机生成数据并输出。

test1:(记得修改后要编译)

#include<bits/stdc++.h>
using namespace std;
long long n,m;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
cout<<n+m<<endl;
return 0;
}

将你的代码放入这里,这个是瞎写的A+B Problem。

test2:(记得修改后要编译)

#include<bits/stdc++.h>
using namespace std;
long long n,m,a,b;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
a+=1;
for(int i=1;i<=m;i++)
b+=1;
cout<<a+b<<endl;
return 0;
}

这是你写的暴力代码。

Pair:(不用修改)

#include<bits/stdc++.h>
using namespace std;
int main()
{
int cnt=0;
cout<<"Pair begin."<<endl;
while(cnt<=100)
{
system("generator.exe > gen.in");
system("test1.exe < gen.in > test1.out");
system("test2.exe < gen.in > test2.out");
if(system("fc test1.out test2.out > data.log"))
{
cout<<"Wrong Answer,";
cout<<"found at Pair "<<cnt<<endl;
cout<<"Pair over."<<endl;
system("generator.exe > data.out");
system("test1.exe < gen.in >> data.out");
system("test2.exe < gen.in >> data.out");
system("start data.out");
return 0;
}
cout<<"Pair times:"<<cnt<<endl;
cnt++;
}
cout<<"Pair over."<<endl;
cout<<"No WA."<<endl;
return 0;
}

在这个对拍核心程序中,调用了三个程序的exe文件,将输出放入out文件中,并对比。

我相对于基础对拍程序加入了WA样例的数据显示。将你test1程序WA掉的样例的输入和两个程序不同的输出放到一起,并在找到问题后立刻打开,方便调试。

最终展示

对拍程序(pair)运行时:

未发现错误:

稍微修改了test1,将n+m改为n-m后,运行效果:

可以看到,运行了之后发现错误,对拍终止,并显示WA数据的输入输出(第一行为输入,后两行分别为test1和test2的输出)

效果还算不错,这篇指导推荐人群:了解对拍原理但懒得写代码的人。

posted @   j1hx  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示