对于信息学竞赛来说,对拍是一个极其重要的技巧,他可以利用一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序。
简单点来说,在比赛过程中,相信大家都经历过写的程序莫名其妙wa了,但是自己手模小数据都没问题的情况,甚至可能自闭到认为是评测姬的问题,这个时候就可以利用对拍来让自己认清wa了的现实,我们可以通过写一个复杂度巨高但绝对正确的暴力,再根据题目代码需求写一个数据生成程序,让暴力代码和wa了的代码同时跑,再写一个运行与结果比较的脚本,实现“简易的评测姬”。如果出现差异就证明你就是wa了,那这个时候就可以拿着数据愉快的debug了
当然,如果拍不出来,也不要怀疑评测姬,绝对是你读错题了
Windows的对拍的方法已经遍地都是,但是针对Mac Os用户却没什么好的博客介绍,所以我今天主要介绍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<=100000),求解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#includeusing namespace std; typedef long long ll; //不开longlong见祖宗! int main(){ freopen("test.in","r",stdin); freopen("test1.out","w",stdout); int n; cin>>n; cout< 需要注意的是这里面freopen写的是对应的test1的in和out,别写差批了
test2.cpp#includeusing 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< compare.cpp #includedata.cpp#include #include 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 correctn",i); } return 0; } #includeusing namespace std; int main() { freopen("test.in","w",stdout); srand(time(0)); int a = rand() % 100000; cout< 每个程序写完了以后都需要进行编译,生成一个可执行文件,Sublime Text会直接生成在原程序的旁边
搞完以后就是这样的(后面的三个是对拍过一次后才会出现的数据储存的
现在还需要我们使用MAC自带的终端,command + 空格直接唤出即可
#简单了解一点可能会用到的linux命令 pwd #表示当前在哪个目录下,也就是路径 cd ... #表示进入...的目录 ./compare #运行compare程序 control + c # 停止运行我们打开终端以后需要进入到对拍的文件夹下,第一个方法就是打开文件夹,把文件夹的名字拖到终端去,就能显示文件夹的路径,使用cd命令就能进入,或者就是下载一个超级右键的app,右键文件夹就可以有一个“进入终端”的命令,
点击就送输入./compare后就会开始对拍,找到错误后就会像下面一样
如果一直跑不出来想停下来的话就用control + c
运行后的数据会放在test.cpp中,可以直接看的
大体上就是这样,详细的步骤我可能会抽时间录一下放B站上,暂时先咕了



