制作对拍文件 - luosiwei-cmd/CarYon GitHub Wiki

制作对拍文件

前言

在比赛的过程中,为了检验自己复杂度低的算法是否正确(或者是否满足时间限制),通常使用再编一个低等算法解决同样问题,然后同时使用大样例对拍这两个程序的生成结果。

又比如,当你用 Online Judge 不清楚自己的程序在哪里出错了,又没有下载数据(或者不想浪费下载次数)的功能,但是有人写的 std,这样的化也可以通过构造样例进行程序对拍解决问题。

再比如,你遇到了某种超级卡常的题目,你需要很好地恒定自己的时间是否过关,你也可以使用 CarYon 对拍功能。只需要定义时限并且对照执行即可。您甚至可以在标准程序和对拍程序放同一个程序来达到恒定卡常题是否解决的效果。

基本步骤

程序的对拍可以大体分为下面几步:

  1. 在当前目录编写 myprogram.cpp 并且编译成 myprogram.exe 文件;
  2. 按照数据生成模块写 test.cppstd.cpp
  3. 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。

⚠️ **GitHub.com Fallback** ⚠️