1.准备对拍代码
第一步是写好两份代码,一份是针对于此题编写的答案代码,只是对于题目提供的样例能够通过,不能确定其正确性。另一份是暴力代码,此代码在一定数据范围内完全正确,但时间复杂度过高不符合题目要求。这是对拍的第一个难点,选手必须能写出一份完全正确的暴力代码,并且明确保证暴力代码正确的数据范围。以此题为例,正解为前缀和,暴力做法为直接用循环求x到y的和。两种代码如下。
1)正解前缀和代码
2)暴力求解代码
2.编写数据生成器代码
接下来需要编写一个数据生成器的代码,用来生成多组测试数据,这是对拍的第二个难点。对于不同的题目,输入数据的格式和要求是不同的。例15-1的数据只是单纯的整数,比较简单。但是NOIP以上级别竞赛难度的题目要求都是较复杂的,常常需要生成树和图等复杂的数据结构,编写生成数据的程序对选手水平有非常高的要求。
在生成数据时,rand()函数常用于生成随机数,但是要注意的是,rand()函数并不是真正的随机,也就是说多次随机生成的数可能是完全相同的。为了生成真正的随机数,可以令随机数的值和时间相关,加入srand(time(NULL))语句即可。
例15-2 生成数据的代码文件命名为“MakeDate”,代码如下:
3.进行对拍
操作步骤如下:
(1)对ZhengJie.cpp、BaoLi.cpp、MakeDate.cpp进行编译,得到ZhengJie.exe、BaoLi.exe、MakeDate.exe三个可执行文件。(www.xing528.com)
(2)编写批处理脚本。先创建一个文本(.txt)文件,命名为“对拍.txt”。输入下面的例15-2批处理代码,保存并关闭文件。
例15-2的批处理代码
(3)在“对拍.txt”文件所在的文件夹里,单击“查看”菜单,勾选“文件扩展名”选项,如图15-46所示。
图15-46 在“查看”菜单里,勾选“文件扩展名”
(4)将“对拍.txt”文件格式由“.txt”改为“.bat”,变成“对拍.bat”,图标变为。再将ZhengJie.exe、BaoLi.exe、MakeDate.exe和对拍.bat四个文件保存在同一文件夹内,如图15-47所示。
图15-47 对拍文件执行前状态
(5)双击执行这个文件夹里的“对拍.bat”文件,出现黑屏将陆续显示对拍的过程和比较的结果,直到比较完全部数据后结束。例15-2提供的两份代码,对拍结果显示均为无差异,如图15-48所示。如果对拍时出现不同结果,会显示不一致的内容并停止执行。请注意:对拍的过程有时可能会很漫长。
图15-48 对拍批处理程序运行结果
对拍结束后文件夹中会多出三个文件,其中data.in中保存的是数据生成器生成并输入测试的数据,ZhengJie.out、BaoLi.out保存的是对拍过程中两份代码的输出。如图15-49所示。
图15-49 对拍文件执行后状态
需要注意的是,例15.1只是提供了一种可以使用的批处理程序代码,程序代码还有很多其他的写法。也可以不使用批处理的方法,直接用C++语言编写,读者可以自行查找相关方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。