用对拍程序来debug错误程序的错误数据

对拍就是通过把自己写的程序的结果和一个完全正确的程序结果进行比较 从而得出自己写的错误程序的漏洞

比如这道题

24点游戏 EOlymp - 44

The number of ones

In arithmetic expression you are allowed to use the number 1, operations of addition, multiplication and parenthesis. What is the minimum number of ones you need to obtain the positive integer n?

Input

One number n (1 ≤ n ≤ 5000).

Output

The required number of ones.

 

题意:将输入的数字 只能通过用1和加乘运算表示出来 问这个数字最少用多少1?

一开始自己想到遍历因数 尽可能用小的因数相乘 不断累积小的因数 从而获得这个数 如果是质数 就-1先算偶数的结果然后 

最后再加1 那么这种做法WA 

复杂度分析:每一个结果要计算O(sqrt(n))次

最大sqrt(5000)约等于71

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5010;
bool bok[maxn];
int cnt;
void div(int n){if(n<=5){cnt+=n;return;}if(!bok[n]){cnt++;div(n-1);}else {for(int i=2;i*i<=n;i++){if(n%i==0){cnt+=i;div(n/i);break;}}}
}
int main()
{freopen("in.txt","r",stdin);freopen("pro.txt","w",stdout);for(int i=2;i<=5000;i++){if(!bok[i])for(int j=i+i;j<=5000;j+=i){bok[j] = 1;}}int n;while(~scanf("%d",&n)){div(n);printf("%d\n",cnt);cnt=0;}return 0;
}

此时可以考虑用对拍检测法检测程序

 

AC程序:

而正确做法动态规划 应该这么做 

对每一个数遍历所有可能乘到这个数的可能 然后从中选择最小的记录下来 

符合动态规划的最优子结构 和重叠子问题 性质 因为大数是通过小数的结果反馈得来
复杂度分析:对于任何一个结果O(n*sqrt(n))

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 5010;
int dp[maxn];
int main()
{freopen("in.txt","r",stdin);freopen("right.txt","w",stdout);dp[1]=1;for(int i=2;i<=5000;i++){dp[i] = dp[i-1]+1;for(int j=2;j*j<=i;j++){if(i%j==0)dp[i] = min(dp[i],dp[i/j]+dp[j]);}}int n;while(~scanf("%d",&n)){printf("%d\n",dp[n]);}return 0;
}

另外数据生成程序:

#include<bits/stdc++.h>
using namespace std;
int main()
{freopen("in.txt","w",stdout);for(int i=1;i<=5000;i++){printf("%d\n",i);}return 0;
}

把所有数据范围的数据都遍历了

或者我们生成随机数

#include<cstdio>
#include<cstring>
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
typedef long long ll;
int main()
{freopen("in.txt","w",stdousrand(time(0));//初始化随机数生成器for(int i=1;i<=100;i++){printf("%d\n",rand()%5000+1);}//注意srand和rand如果放到一起写 一般同一秒内生成的随机数是相同的//因为time(0)是根据1970年1月1日00点00分00秒开始到现在的秒数return 0;
}

最后测试程序

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
stringstream ss;
int main(int argc,char *argv[])
{int t= 100;system("data.exe");//运行数据生成程序int s1 = clock();system("right.exe");//执行正确程序int e1 = clock();cout<<s1<<endl;system("pro.exe");//执行错误程序int e2 = clock();cout<<e2<<endl;Sleep(1000);//程序暂停1scout<<e1-s1<<" "<<e2-e1<<endl;//输出两个程序的耗费时间(ms)if(system("fc pro.txt right.txt")){//比较两个文件是否存在不同printf("WA");}return 0;
}

那么运行最后的错误程序 就能看到是否有不一样输出的地方了

最后发现46这里有问题:

自己的程序

46 = 2*23

23 = 1+22

22 = 2*11

11 = 1+10

10 = 2*5

sum up:2+1+2+1+2+5 = 13

正确程序:比如 46 就是遍历所有的可能 dp[45]+1 

或者通过 45 = 5*9

9 = 3*3 

sum up : 1+5 + 3+3 = 12

这种结果并不是通过因数拆分得到的 而是通过遍历所有可能选出最小的可能 而双数在错误程序中 必定是一个通过2去化简的数

所以这种情况直接略过了从45过渡过来的可能 略过了最小的可能 所以当选择极限方案时 还是不仅要考虑贪心 也要考虑DP

贪心是我们已知的最优解的走法 而动态规划是我们要从所有子问题分支中依据数值选择出最优的分支 

对于问题的判断不清 很容易选择贪心算法 错误的选择了最优分支 而不忽略了真正的最优可能分支

那么对拍检测4步:

1 自己的待查程序

2 一个正确/暴力程序

3 一个输出生成程序

4 测试程序

四个程序最好放到同一目录结构下

运行测试程序 找出错误实例

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]

【问题描述】[困难] 【解答思路】 1. 思路1 时间复杂度&#xff1a;O(logN) 空间复杂度&#xff1a;O(N) import java.util.PriorityQueue;public class MedianFinder {/*** 当前大顶堆和小顶堆的元素个数之和*/private int count;private PriorityQueue<Integer> maxh…

学习笔记,单例

class test(object):flog Noneflog1 Falsedef __new__(cls, *args, **kwargs):if cls.flog is None:cls.flog super().__new__(cls)return cls.flogdef __init__(self):if not test.flog1:print("初始化")test.flog1 Trueabc test() bcd test() print(abc) pri…

SpingBoot+Mybaits+Vue,更新学习

1.DTO 2.实体类 3.Controller层&#xff0c;UpdatePrize/{id}为接口 4.Service层 5.Impl实现层 之后就可以更新数据了。6.Vue链接接口 7.请求&#xff0c;解析&#xff0c;返回值 8.init方法&#xff0c;初始化使用 增删查与更相仿&#xff0c;只是实现层方法不同增加实现层中的…

[剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]

【问题描述】[中等] 【解答思路】 1. 暴力 直接复制 将链表从头节点一个一个复制下去&#xff0c; 在根据记录的总长度num&#xff0c;遍历原来的每个节点的random到尾节点个数count&#xff0c;然后顺序遍历找到新链表的该指针在num-count上 。 时间复杂度&#xff1a;O(N^2…

C语言中的四舍六入五成双 和 四舍五入

%.mf 可以让浮点数保留 m 位小数输出 保留的是精度为 四舍六入五成双 就是 5以下舍弃 5以上进位 而当下一位为5时要讨论&#xff1a; 被化简的小数位后面一位的数字等于5时 要看5前面的数字&#xff0c;若是奇数则进位&#xff0c; 若是偶数则将5舍掉&#xff0c;即修约后…

第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”

工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#xff0c;降低生产成本。 工业4.0在德…

【复习】快速幂算法详解

快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O&#xff08;n&#xff09;转化为O&#xff08;logn&#xff09;的算法 他的原理就是&#xff1a; 252^525 2∗2∗2∗2∗22*2*2*2*22∗2∗2∗2∗2 21012^{101}2…

vue监听移动设备的返回事件

在公共方法文件common.js中实现一个存储当前历史记录的方法 common.js // 存储当前历史记录点,实现控制手机物理返回键的按钮事件 var pushHistory function () {let state {title: ,url: }window.history.pushState(state, state.title, state.url) } vue页面 mounted () {p…

[剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

【问题描述】[中等] 【解答思路】 中序遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {Node pre, head;public Node treeToDoublyList(Node root) {if(root null) return null;dfs(root);head.left pre;pre.right head;return head;}void …

深度学习第一次课-数学

说明&#xff1a;本文是七月算法5月深度学习班第一次课听课笔记。只记录关键知识点&#xff0c;有些没具体展开。帮助复习用。文中使用了老师课件中的公式。 微积分 导数 定义常用函数导数导数法则加法 乘法 除法 链式法则一元函数与多元函数一阶导 一元函数 f(x) 多元函…

使用CUPS打印服务

目录1. 测试环境 22. CUPS介绍 32.1 CUPS的配置文件 32.1.1 cupsd.conf 32.1.2 cups-files.conf 32.1.3 printcap 32.1.4 printers.conf 32.2 SPOOL假脱机 42.3 CUPS 支持各种打印机&#xff0c;包括&#xff1a; 42.4 CUPS的beh 42.5 使用beh 52.6 安装cups&#xff0c;并激活…

深度学习第三次课-梯度下降与反向传播

梯度下降 损失函数可视化 得分函数 fW*X损失函数 cW*X-y 目标 损失函数最小 最优化过程可视化 一维二维 热力图如果损失函数是一个凸函数&#xff0c;例如SVM。凸函数 正系数加和凸函数神经网络 costfunction 非凸 因为系数有正有负。凸优化与最优化…

[Leetcode][第1025题][JAVA][除数博弈][数学][递推]

【问题描述】[中等] 【解答思路】 1. 数学证明 找规律 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1a;O(1) 2. 递推 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public boolean divisorGame(int N) {boolean[] f new boolean[N 5];f[1]…

《App后台开发运维与架构实践》第2章 App后台基础技术

2.1 從App業務邏輯中提煉API接口    業務邏輯思維導圖    功能-業務邏輯思維導圖    基本功能模塊關系    功能模塊接口UML&#xff08;設計出API&#xff09;    在設計稿標注API    編寫API文檔    2.2 設計API的要點    根據對象設計API  …

[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 &#xff08; i ≥ j &#xff09; 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 f[i][…

深度学习第二课--图像识别与KNN

图像分类的难点 视角不同尺寸不同变形光影背景干扰同类内的差异 例如躺椅、座椅、 图像识别的核心 数据驱动学习。就像人看过很多猫以后&#xff0c;就知道什么是猫。把很多同一类的图片“喂给”计算机&#xff0c;让计算机自己去学习该类图片的特征。之后做出评估。KNN解决…

Vasya and Multisets CodeForces - 1051C 模拟|分类讨论

题意&#xff1a;把数组分成两个集合 每个集合中元素数量为1的个数相同&#xff08;此个数可以是0&#xff09; 分析&#xff1a; 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为1的元素数为偶数个 对半分 如果元素数量…

centos安装多个tomcat

1.参考前文安装jdk、第一个tomcat 2.安装第二个tomcat后&#xff0c;修改/etc/profile vi /etc/profile #tomcat1  export CATALINA_BASE/opt/tomcat1  export CATALINA_HOME/opt/tomcat1  export TOMCAT_HOME/opt/tomcat1 #tomcat2  export CATALINA_BASE2/opt/tomcat…

[小技巧][Java]Arrays.fill() 初始化 二维数组

Arrays.fill()并不能提高赋值的效率&#xff0c;在函数的内部也是用for循环的方式 实现的。 fill()函数源码&#xff1a; public static void fill(Object[] a, Object val) {for (int i 0, len a.length; i < len; i)a[i] val;}for (int i 0; i < n; i) {Arrays.fil…

Grid game CodeForces - 1104C 放格子|思维|找规律

题意&#xff1a;4*4的格子中输入0放 2*1的图案输入1放1*2的图案 当摆满一行或一列后此行列图案清空 就想毛熊方块一样 分析&#xff1a;开始感觉很唬人 要搜索还是要dp啥的 后来发现原来2*1就放左下 1*2就放左上 然后来啥清空啥 就能够循环不断地放下去 然后变成了一道巨水题…