制作对拍文件 - luosiwei-cmd/CarYon GitHub Wiki
在比赛的过程中,为了检验自己复杂度低的算法是否正确(或者是否满足时间限制),通常使用再编一个低等算法解决同样问题,然后同时使用大样例对拍这两个程序的生成结果。
又比如,当你用 Online Judge 不清楚自己的程序在哪里出错了,又没有下载数据(或者不想浪费下载次数)的功能,但是有人写的 std,这样的化也可以通过构造样例进行程序对拍解决问题。
再比如,你遇到了某种超级卡常的题目,你需要很好地恒定自己的时间是否过关,你也可以使用 CarYon 对拍功能。只需要定义时限并且对照执行即可。您甚至可以在标准程序和对拍程序放同一个程序来达到恒定卡常题是否解决的效果。
程序的对拍可以大体分为下面几步:
- 在当前目录编写
myprogram.cpp
并且编译成myprogram.exe
文件; - 按照数据生成模块写
test.cpp
和std.cpp
; - 在
test.cpp
后加一行:debug(/*开始*/,/*结束*/);
并且加上时间限制。这里时间限制的变量是long double
类浮点型并且单位是毫秒,变量名叫做maxtime
,默认值为1000 ms
。
对于每一个测试点,目前只支持定义相同的时限。
maxtime=1000;
这是默认的时间值,单位为毫秒,默认评测时间为1000毫秒。
请注意,本地运行和在 Online Judge 上不同,本地运行程序的时间可能会受各种方位的影响,这里推荐将时限加至提交时间限制的 1.5 倍。
提交自己的高精度 a+b,这个时候你就需要用低精的数值和你的程序对拍。
首先,把下面的高精度版a+b放到你的myprogram.cpp
里面,编译成myprogram.exe
:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string a,b;
int xa[500]={},xb[500]={},tot[500]={};
cin>>a>>b;
for(int i=0;i<a.length();i++)
xa[i]=a[a.length()-i-1]-'0';
for(int i=0;i<b.length();i++)
xb[i]=b[b.length()-i-1]-'0';
int len=max(a.length(),b.length());
for(int i=0;i<len;i++)
tot[i]=xa[i]+xb[i];
for(int i=0;i<len;i++)
{
tot[i+1]+=tot[i]/10;
tot[i]%=10;
}
if(tot[len]) cout<<tot[len];
for(int i=len-1;i>=0;i--)
cout<<tot[i];
cout<<endl;
}
然后在 std.cpp
中填写最简单的 a+b
;
并且这样编写 test.cpp
:
#include"caryon.h"
using namespace std;
using namespace ca;
int main(){
dataname="a+btest";
maxtime=1000;
makein(1,10){
csh();
inint(cyrand(-100000,100000);
instring(" ");
inint(cyrand(-100000,100000);
}
makeout(1,10);
debug(1,10);
return 0;
}
运行后可以发现不仅有data-a+btest
文件夹,里面有a+btest1.in/out-a+btest10.in/out
,还出现了一个新的文件夹debug-a+btest
文件夹,里面是myprogram.exe
输出的a+btest1.ans-a+b10.ans
,在根目录还多出了一个文件:Debug.log
。
然后的操作请见下一个 Wiki。