type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于:My Blog 欢迎大佬们前来逛逛
数据对拍
使用数据对拍的功能来检测代码有没有出错误。
步骤:针对某个题的做题过程
- 首先写这道题的你认为的优化做法,因为一般的算法竞赛中肯定不可能是暴力的。
- 然后写这道题的暴力做法。
- 然后写数据对拍器,比较数据的差异
举例
dp
对于背包问题我们可以有 dp动态规划的做法(这是最基本的),代码如下:
暴力
对于01背包的暴力方法,我们考虑
二进制枚举的思想
。对于每一个 n,我们都把它转换为二进制的形式,其中
1
表示选择这个物品,0
表示不选择这个物品,则通过暴力枚举二进制的所有的01情况
,来得到每一种情况的背包价值,然后得到ans假设n=5 ,则我们需要枚举
00000 - 11111
共32种情况,即 1<<5种
,然后通过一层循环来获得二进制中所有的1
,然后进行数据的累加。注意我们的范围都是从 0开始的,因为二进制中
全0
表示都不选,全1
表示全选,因此我们的for循环要写成这样的形式:代码如下:
数据对拍
然后就到了我们的重头戏:数据对拍,首先把生面生成的
两个exe
放到同一文件夹下面基本思路:
- 通过随机产生数据,把数据存储到
input.txt
中。
- 对于上面的两个
exe
程序,从文件读取内容
,然后分别把两个运行的结存储到两个xx_out,txt
文件中。
- 然后比较这两个
xxx_out.txt
文件内容是否是一致的。
如何进行文件的读写?
- 头文件:
#include <fstream>
表示对文件流操作;
ofstream out(input.txt)
输出重定向到文件中
ifstream in(input.txt)
输入重定向到文件中
system对文件的操作
system("dp.exe < input.txt > dp_out.txt")
,dp解法从文件读取数据,然后把dp.exe的输出重定向到dp_out.txt中;对于暴力也是同理。
system("fc dp_out.txt baoli_out.txt")
,比较两个文件是否存在差异。
如果没有差异,证明我们写的解法基本上是正确的。
总结
通过手写两种解法(优化 and 暴力)并且通过数据对拍的功能来实现降低我们程序出错的可能性,数据对拍在蓝桥杯等竞赛中是一个不错的技巧。
- 作者:Yuleo
- 链接:https://www.helloylh.com/article/data_part
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。