4554 Balls
The classic Two Glass Balls brain-teaser is often posed as:
“Given two identical glass spheres, you would like to determine the lowest floor in a 100-story
building from which they will break when dropped. Assume the spheres are undamaged
when dropped below this point. What is the strategy that will minimize the worst-case
scenario for number of drops?”
Suppose that we had only one ball. We’d have to drop from each floor from 1 to 100 in sequence,
requiring 100 drops in the worst case.
Now consider the case where we have two balls. Suppose we drop the first ball from floor n. If it
breaks we’re in the case where we have one ball remaining and we need to drop from floors 1 to n − 1
in sequence, yielding n drops in the worst case (the first ball is dropped once, the second at most n − 1
times). However, if it does not break when dropped from floor n, we have reduced the problem to
dropping from floors n + 1 to 100. In either case we must keep in mind that we’ve already used one
drop. So the minimum number of drops, in the worst case, is the minimum over all n.
You will write a program to determine the minimum number of drops required, in the worst case,
given B balls and an M -story building.
Input
The first line of input contains a single integer P , (1 ≤ P ≤ 1000), which is the number of data sets that
follow. Each data set consists of a single line containing three (3) decimal integer values: the problem
number, followed by a space, followed by the number of balls B, (1 ≤ B ≤ 50), followed by a space and
the number of floors in the building M , (1 ≤ M ≤ 1000).
Output
For each data set, generate one line of output with the following values: The data set number as a
decimal integer, a space, and the minimum number of drops needed for the corresponding values of B
and M .
Sample Input
4
1
2
3
4
2 10
2 100
2 300
25 900
Sample Output
1   4
2   14
3   24
4   10

这题就是很出名的扔鸡蛋问题,不过这道题改成了玻璃球。

想要找到,在最坏的情况下,我们所需要的检测次数最少来找到鸡蛋在哪一楼层之下,鸡蛋不会被摔碎,输出最少的次数。

一共有m个鸡蛋,n层楼,dp[m][n]表示有m个鸡蛋,需要检测的层数有n层。

首先我们要确立最坏的情况,

假设我们在1 to n层中任选一层扔下鸡蛋,假设在第i层扔下,1:如果鸡蛋在第i层碎掉了,还剩m-1个鸡蛋,现在只需要 在1 to
i-1层中检测,剩下i-1个楼层需要检测,dp[m][i] = dp[m-1][i-1] +
1,1表示第i层的检测。2:如果鸡蛋在第i层没有碎,还剩m个鸡蛋,现在只需要在i+1 to
n层中检测,剩下n-i个楼层需要检测,dp[m][i] = dp[m][n-1] +
1,1表示第i层的检测。最坏的情况就是,两种情况之下,所需要检测的次数最多的那一种情况。

然后找到在(1,n)层中,从哪层扔下所需次数最少的情况。

 1 #include<cstdio>
2 #include<algorithm>
3 using namespace std;
4 int dp[1001][1001];
5 int judge_(int a,int b){
6 for(int i = 0; i <=b; ++i) {
7 dp[0][i] = 0;//如果没有鸡蛋,需要的次数都为0
8 dp[1][i] = i;//如果鸡蛋只有一个,那么需要的次数就是楼层数
9 }
10 for(int i = 2; i <= a; ++i) {
11 dp[i][0] = 0;//如果没有楼层,所需要的次数是0
12 dp[i][1] = 1;//如果只有1个楼层,所需要的次数是1
13 }
14 for(int i = 2; i <= a; ++i) {//鸡蛋从2 to a 遍历
15 for(int j = 2; j <= b;j++) {//楼层从2, to b遍历,dp[i][j]表示,在有i个鸡蛋,j个楼层需要检测的情况下所需要的最小检测次数
16 int t = 0x3f3f3f;
17 for(int k = 1; k <= j; ++k) {//找到1 to j从哪一个楼层扔下所需要的次数最少
18 t = min(t,1 + max(dp[i-1][k-1],dp[i][j-k]));// max(dp[i-1][k-1],dp[i][j-k]) 找到碎和不碎的情况下,所需要的最大的次数,即最坏的情况
19 }
20 dp[i][j] = t;//将最小的次数赋值给在有i个鸡蛋,j个楼层需要检测的情况下的最小次数
21 }
22 }
23 return dp[a][b];//输出在有a个鸡蛋,b个楼层需要检测的情况下的需要的最小次数
24 }
25 int main()
26 {
27 int p;
28 scanf("%d",&p);
29 while (p--) {
30 int n,a,b;
31 scanf("%d %d %d",&n,&a,&b);
32 printf("%d %d\n",n,judge_(a,b));
33 }
34 return 0;
35 }

贴一个写的比较好的博客吧

https://blog.csdn.net/joylnwang/article/details/6769160

Balls(扔鸡蛋问题)的更多相关文章

  1. POJ 3783 Balls --扔鸡蛋问题 经典DP

    题目链接 这个问题是谷歌面试题的加强版,面试题问的是100层楼2个鸡蛋最坏扔多少次:传送门. 下面我们来研究下这个题,B个鸡蛋M层楼扔多少次. 题意:给定B (B <= 50) 个一样的球,从 ...

  2. [CareerCup] 6.5 Drop Eggs 扔鸡蛋问题

    6.5 There is a building of 100 floors. If an egg drops from the Nth floor or above, it will break. I ...

  3. 扔鸡蛋问题具体解释(Egg Dropping Puzzle)

    经典的动态规划问题,题设是这种: 假设你有2颗鸡蛋,和一栋36层高的楼,如今你想知道在哪一层楼之下,鸡蛋不会被摔碎,应该怎样用最少的測试次数对于不论什么答案楼层都可以使问题得到解决. 假设你从某一层楼 ...

  4. 扔鸡蛋问题详解(Egg Dropping Puzzle)

    http://blog.csdn.net/joylnwang/article/details/6769160 经典的动态规划问题,题设是这样的:如果你有2颗鸡蛋,和一栋36层高的楼,现在你想知道在哪一 ...

  5. Coursera Algorithms week1 算法分析 练习测验: Egg drop 扔鸡蛋问题

    题目原文: Suppose that you have an n-story building (with floors 1 through n) and plenty of eggs. An egg ...

  6. Leetcode 887 Super Egg Drop(扔鸡蛋) DP

    这是经典的扔鸡蛋的题目. 同事说以前在uva上见过,不过是扔气球.题意如下: 题意: 你有K个鸡蛋,在一栋N层高的建筑上,被要求测试鸡蛋最少在哪一层正好被摔坏. 你只能用没摔坏的鸡蛋测试.如果一个鸡蛋 ...

  7. Google面试题-高楼扔鸡蛋问题

    本文由 @lonelyrains 出品.转载请注明出处.  文章链接: http://blog.csdn.net/lonelyrains/article/details/46428569 高楼扔鸡蛋问 ...

  8. zstu 4214 高楼扔鸡蛋(google 面试题)dp

    input T 1<=T<=10000 n m 1<=n<=2000000007 1<=m<=32 output m个鸡蛋从1到n哪一楼x扔下去刚好没碎,而再x+1 ...

  9. 高楼扔鸡蛋问题(鹰蛋问题) POJ-3783

    这是一道经典的DP模板题. https://vjudge.net/problem/POJ-3783#author=Herlo 一开始也是不知道咋写,尝试找了很多博客,感觉有点领悟之后写下自己的理解. ...

随机推荐

  1. 用IDEA时,类/方法提示"class/method **** is never used"

    https://segmentfault.com/q/1010000005996275?_ea=978306 清理下缓存试下.在 File -> Invalidate Caches 下,会重启 ...

  2. NAS (Network Attached Storage)

    当电脑硬盘容量满了,多数使用者第一个想法就是买一块几TB的硬盘来扩充,如果是笔电的使用者,第一个想到的是买一个外接式硬盘来备份资料,这样的想法并没有错,那是当你还不知道有「NAS」这个好用的东西,才会 ...

  3. 自由线程FreeThreadDOMDocument

    Posted on 2006年09月4日by 不及格的程序员-八神 星期二 天气:晴   昨天燕子 自己去五爱了 给我买了一堆袜子 给妈买了一双鞋 给自己买了一件 红色的内衣服 挺好看的 在市场买了一 ...

  4. jQuery-2.DOM---jQuery遍历

    jQuery遍历之children()方法 jQuery是一个合集对象,如果想快速查找合集里面的第一级子元素,此时可以用children()方法.这里需要注意:.children(selector) ...

  5. 操作系统口令认证,sysdba本地登录需要输入密码

    开发测试人员,反馈,sqlplus / as sysdba 登陆需要输入密码? 本篇文档流程: 1.场景还原 2.问题处理 3.相关问题介绍 一.场景还原 1)配置SQLNET.ora配置文件,配置操 ...

  6. Windows跨域远程连接防火墙设置

    按照正常的防火墙的设置,发现跨域远程依然不行,后来进过排除法发现 还需要打开icmpv4所有的协议,才可以

  7. Reasoning With Neural Tensor Networks For Knowledge Base Completion-paper

    https://www.socher.org/index.php/Main/ReasoningWithNeuralTensorNetworksForKnowledgeBaseCompletion 年份 ...

  8. Spring Boot Shiro 权限管理 【转】

    http://blog.csdn.net/catoop/article/details/50520958 主要用于备忘 本来是打算接着写关于数据库方面,集成MyBatis的,刚好赶上朋友问到Shiro ...

  9. #考研笔记#计算机之word问题

    Word 问题:1. 如何为文档加密保存?单击 office 按钮\另存为\工具按钮\常规选项\设置打开文件时的密码 2. 怎样在横格稿纸中录入古诗?单击 office 按钮\新建\模板\信纸\稿纸( ...

  10. sqluldr2 学习心得

    前言 最近正在做一个项目,需要导出数据库中的表,单数数据库中有很多带有虚拟列的表,而且表中的数据非常的庞大,有些表中的数据上亿条,项目经理让我研究如何快速导出这些数据. 下面是我研究的一些经历: (1 ...