鸡蛋的硬度

总时间限制: 1000ms

内存限制: 65536kB

描述

最近XX公司举办了一个奇怪(super strange!)的比赛:鸡蛋硬度之王争霸赛。参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法--从高度扔鸡蛋--来 测试鸡蛋的硬度,如果一次母鸡下的蛋从高楼的第a层摔下来没摔破,但是从a+1层摔下来时摔破了,那么就说这只母鸡的鸡蛋的硬度是a。你当然可以找出各种 理由说明这种方法不科学,比如同一只母鸡下的蛋硬度可能不一样等等,但是这不影响XX公司的争霸赛,因为他们只是为了吸引大家的眼球,一个个鸡蛋从100 层的高楼上掉下来的时候,这情景还是能吸引很多人驻足观看的,当然,XX公司也绝不会忘记在高楼上挂一条幅,写上“XX公司”的字样--这比赛不过是XX 公司的一个另类广告而已。 
勤于思考的小A总是能从一件事情中发现一个数学问题,这件事也不例外。“假如有很多同样硬度的鸡蛋,那么我可以用二分的办法用最少的次数测出鸡蛋 的硬度”,小A对自己的这个结论感到很满意,不过很快麻烦来了,“但是,假如我的鸡蛋不够用呢,比如我只有1个鸡蛋,那么我就不得不从第1层楼开始一层一 层的扔,最坏情况下我要扔100次。如果有2个鸡蛋,那么就从2层楼开始的地方扔……等等,不对,好像应该从1/3的地方开始扔才对,嗯,好像也不一定 啊……3个鸡蛋怎么办,4个,5个,更多呢……”,和往常一样,小A又陷入了一个思维僵局,与其说他是勤于思考,不如说他是喜欢自找麻烦。 
好吧,既然麻烦来了,就得有人去解决,小A的麻烦就靠你来解决了:)

输入

输入包括多组数据,每组数据一行,包含两个正整数n和m(1<=n<=100,1<=m<=10),其中n表示楼的高度,m表示你现在拥有的鸡蛋个数,这些鸡蛋硬度相同(即它们从同样高的地方掉下来要么都摔碎要么都不碎),并且小于等于n。你可以假定硬度为x的鸡蛋从高度小于等于x的地方摔无论如何都不会碎(没摔碎的鸡蛋可以继续使用),而只要从比x高的地方扔必然会碎。
对每组输入数据,你可以假定鸡蛋的硬度在0至n之间,即在n+1层扔鸡蛋一定会碎。

输出

对于每一组输入,输出一个整数,表示使用最优策略在最坏情况下所需要的扔鸡蛋次数。

样例输入

100 1
100 2

样例输出

100
14

提示

最优策略指在最坏情况下所需要的扔鸡蛋次数最少的策略。

如果只有一个鸡蛋,你只能从第一层开始扔,在最坏的情况下,鸡蛋的硬度是100,所以需要扔100次。如果采用其他策略,你可能无法测出鸡蛋的硬度(比如你第一次在第二层的地方扔,结果碎了,这时你不能确定硬度是0还是1),即在最坏情况下你需要扔无限次,所以第一组数据的答案是100。

分析:

下面是关于第二个数据的分析:

就拿14来算,因为是两个蛋,一个碎了还有一个可以扔。如果是14,第一次就扔15,如果碎了,就从扔第一层开始扔,扔到第13层如果碎了,就可以直接判断出是第14层,加起来就有14次。如果没碎,就还有13次机会,就从28层开始扔,碎了就是同样的分析方法,没碎就继续往下扔,这样就得出:第一次扔15楼,第二次28楼,第三次40楼,第四次51楼,第五次61楼,第六次70楼,第七次78楼,第八次85楼,第九次91楼,第十次96楼,第十一次就可以达到100楼,再加上96到100中间有3次,就是14次。如果不是14,用其他数据就不能刚好得出。

所以(以下为转载内容):f[i][j]表示从第i层,用j个蛋尝试,所用得的最小次数,f[i][j]并不代表一定在第i层去扔,可以在1~i中任意一层扔下一个蛋,因此搞一个循环变量k,k从1~i,对于一个当前的k,这个鸡蛋扔下去有两种情况:碎和不碎。如果碎了,那此时只有j-1个蛋,要尝试1~k-1层,即是f[k-1][j-1];如果不碎,还有j个蛋,那么就要考虑k+1~i层,这等效于f[i-k][j]。所以f[i][j]=min(f[i][j],max(f[k-1][j-1],f[j-k][j])+1)。

下面是代码(部分为转载内容):

#include #include #include using namespace std;
int f[101][101]; //定义一个二维数组,表示第几楼和扔第几次蛋。
int i,j,k;
int n,m;  //楼层数和蛋的数目
int min(int a,int b){return ab ?a:b;}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){  //录入多组数据
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++) f[i][j]=i;  //依次输入楼层数和蛋数
for(int i=1;i<=n;i++)       //进入扔蛋循环
for(int k=1;k<=i;k++)      //定义一个中间变量,在这个地方进行判断转折与否(也就是碎了往下走,没碎往上走)
for(int j=2;j<=m;j++)
f[i][j]=min(f[i][j],max(f[k-1][j-1],f[i-k][j])+1);
cout<<



【动态规划·经典例题】鸡蛋的硬度相关推荐

  1. ヾ(o◕∀◕)ノヾ各种动态规划经典例题(新手向、多类型)

    ヾ(o◕∀◕)ノヾ各种动态规划经典例题(新手向.多类型) 一.前言 ヾ(・ω・`。)我把比较常见的类型的动态规划找了一些经典的例题,适合作为新手的入门例题,用于帮助我们对各种不同的动态规划有所了解,很 ...

  2. 运筹说 第69期 | 动态规划经典例题讲解

    通过前几期的学习,我们已经学会了动态规划的基本概念和基本原理,并且掌握了动态规划模型的建立和具体的求解方法,本期小编带大家学习动态规划在经济管理中的应用. 除了前面讲到的最优路径.资源分配问题外,动态 ...

  3. 动态规划经典例题:乘积最大连续子数组

    题目: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如数组:arr[]={1, 2, 3, -2, 4, -3 ...

  4. 动态规划经典例题:钢条切割

    一.递归算法 如果在第i个地方切割,就把钢条分为两个长度为i,n-i的钢条,问题转化为求这切割两个钢条的最大价值之和 考虑到不切割时的价值 只要比较不切割时的价值和所有切割情况价值和的最大值即可 递归 ...

  5. 动态规划经典例题-国王的金矿问题

    金矿问题 问题概述: 有一位国王拥有5座金矿,每座金矿的黄金储量不同, 需要参与挖掘的工人人数也不同.例如有的金矿储量是500kg黄金,需 要5个工人来挖掘:有的金矿储量是200kg黄金,需要3个工人 ...

  6. 动态规划经典例题解析

    一.不同路径问题 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角 ...

  7. 数字三角形(动态规划经典例题)

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜 ...

  8. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

  9. 动态规划算法经典例题_c动态规划精简例题

    相信很多初学者,在刚刚接触动态规划,都花费了不少时间.网上有很多人写如何去做动态规划的题目,但是很少有整理适合初学者做的习题.这里是我自己考研期间,复习整理的.希望对大家有帮助. c动态规划精简例题 ...

最新文章

  1. C++ 笔记(26)— 主函数 main(int argc, char *argv[]) 参数说明
  2. Kraken采用CashAddr地址,BCH地址统一向前一步
  3. 读书笔记 — Java高并发程序设计 — 第三章 — 锁
  4. python爬取网页防止重复内容_python解决网站的反爬虫策略总结
  5. 16 bit float 存储_面试官问我存储金额应该用哪种数据类型,我竟这样回答
  6. esp8266接收到的数据如何存放到数组中_Java中HashMap的实现原理
  7. mysql中有exist吗_关于MySQL 中 EXISTS 的用法
  8. Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)
  9. 给定一个净值序列,计算年化收益、最大回撤、夏普比率
  10. 【Redis】Redis各个版本的下载安装教程
  11. Linux 串口termios.h分析
  12. 使用vcpkg安装cgal前安装yasm报错
  13. 史上最简单的 GitHub 教程
  14. 压缩包 点击解压.html,快速恢复因压缩包解压后而丢失的文件数据|悟空恢复大师...
  15. JS测试显示屏分辨率以及屏幕尺寸
  16. 带看门狗的PMOS缓启电路
  17. ios-音乐播放器的简单实现
  18. Python 【趣头条】短视频的自动上传与发布实例演示,同时支持抖音、快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
  19. 计算机视觉与深度学习基本环境安装
  20. SAP MM ME57 把PR转成PO

热门文章

  1. 简介三种垃圾回收机制:分代复制垃圾回收,标记垃圾回收,增量垃圾回收
  2. 手机制作html蓝底白字,怎么制作html5手机页面?
  3. Mac 下IDEA无法启动的问题的解决
  4. cad模型轻量化_BIM模型轻量化到底有啥用?三种解决方案按需挑选!
  5. Redis持久化:RDB内存快照
  6. 华为交换机ip地址与MAC地址绑定
  7. 第2章 时间空间复杂度计算
  8. C++ opencv基于OTSU图像多阈值分割
  9. 脑皮质算法篇(1)-- 导读
  10. C(n,m);二项式系数公式