简述:
对于信息学竞赛来说,对拍是一个极其重要的技巧,他可以利用一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序。
简单点来说,在比赛过程中,相信大家都经历过写的程序莫名其妙wa了,但是自己手模小数据都没问题的情况,甚至可能自闭到认为是评测姬的问题,这个时候就可以利用对拍来让自己认清wa了的现实,我们可以通过写一个复杂度巨高但绝对正确的暴力,再根据题目代码需求写一个数据生成程序,让暴力代码和wa了的代码同时跑,再写一个运行与结果比较的脚本,实现“简易的评测姬”。如果出现差异就证明你就是wa了!这个时候就可以拿着数据愉快的debug了
当然,如果拍不出来,也不要怀疑评测姬,绝对是你读错题了
Windows的对拍的方法已经遍地都是,但是针对MAC用户却没什么好的博客介绍,所以我今天主要介绍MAC用户如何实现程序对拍
前置准备
Sublime Text
简单介绍一下Sublime Text,他是一个轻量级的文本编辑器,以界面简洁优美闻名
下载的话直接去官网下载即可
简单配置一下Sublime Text
-
点击
Tools
->Build System
->Build New System
-
然后输入一下配置:(直接全粘贴过去就行
{ "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/${file_base_name}'"], "file_regex": "^(..{FNXX==XXFN}*):([0-9]+):?([0-9]+)?:? (.*)$", "working_dir": "${file_path}", "selector": "source.c, source.c++", "variants": [ { "name": "Run", "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/${file_base_name}' && open -a Terminal.app '${file_path}/${file_base_name}'"] } ] }
-
然后按然后按
Command+S
保存,命名为C/C++.sublime-build
,名字C/C++
你随便起,但是后缀名和保存路径不要改,默认就行该配置文件会保存在
/Users/用户名/Library/Application Support/Sublime Text 3/Packages/User
下 -
然后现在可以写c/c++的代码了,写完之后,点击
Tools
->Build System
->C:C++
注意,因为我刚刚保存的时候文件名是
C/C++
,其中的/
被自动替换成:
了,所有C:C++
也就是我刚刚保存的配置文件 -
选择完编译器之后,按
Command+B
, 然后选择C:C++ - Run
即可运行,下次直接按Command+B
就可以运行了
模拟评测姬
举个例子:
给定一个自然数n (n<=50000),求解1+2+3+…+n的和
test1.cpp 需要检验正确性的程序
test2.cpp 暴力程序
data.cpp 数据生成程序
compare.cpp 比较程序
这个题,我们暴力写的程序test2.cpp就是暴力跑1到n的和,用longlong计算
需要检验的程序test1.cpp就写n * (n + 1) / 2,但是用的是int的变量
可以看出n稍大一些的时候就会爆int
在桌面建一个文件夹,写出下面四个程序,都放在该文件夹里面
test1.cpp
#include<iostream>
using namespace std;
typedef long long ll;
//不开longlong见祖宗!
int main(){
freopen("test.in","r",stdin);
freopen("test1.out","w",stdout);
int n;
cin>>n;
cout<<n * (n + 1) / 2<<endl;
return 0;
}
需要注意的是这里面freopen写的是对应的test1的in和out,别写差批了
test2.cpp
#include<iostream>
using namespace std;
typedef long long ll;
//不开longlong见祖宗!
int main(){
freopen("test.in","r",stdin);
freopen("test2.out","w",stdout);
int n;
ll sum = 0;
cin>>n;
for(int i = 1; i <= n; ++i)sum += i;
cout<<sum<<endl;
return 0;
}
compare.cpp
#include<cstdio>
#include<cstdlib>
#include<iostream>
int main()
{
int tmp=0;
for(int i=1;i<=10000;i++)
{
system("./data");
system("./test1");
system("./test2");
// if(i/100>tmp) {printf("-- %d --\n",i);tmp=i/100;}
if(system("diff test1.out test2.out"))
{
printf("wrong in --> %d \n",i);
break;
}
printf("process %d is correct\n",i);
}
return 0;
}
data.cpp
#include<iostream>
using namespace std;
int main()
{
freopen("test.in","w",stdout);
srand(time(0));
int a = rand() % 100000;
cout<<a<<endl;
return 0;
}
每个程序写完了以后都需要进行编译,生成一个可执行文件,Sublime Text会直接生成在原程序的旁边
搞完以后就是这样的
现在还需要我们使用MAC自带的终端,command + 空格直接唤出即可
#简单了解一点可能会用到的linux命令
pwd #表示当前在哪个目录下,也就是路径
cd ... #表示进入...的目录
./compare #运行compare程序
control + c # 停止运行
我们打开终端以后需要进入到对拍的文件夹下,第一个方法就是打开文件夹,把文件夹的名字拖到终端去,就能显示文件夹的路径,使用cd
命令就能进入,或者就是下载一个超级右键的app,右键文件夹就可以有一个“进入终端”的命令,点击就送
输入./compare
后就会开始对拍,找到错误后就会像下面一样
如果一直跑不出来想停下来的话就用control + c
运行后的数据会放在test.cpp中,可以直接看的
大体上就是这样,详细的步骤我可能会抽时间录一下放B站上,暂时先咕了