鸡蛋的硬度

描述

最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛。参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是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。

思路:

  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)。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <cmath>
 7 #include <algorithm>
 8 using namespace std;
 9 int dp[1001][101];
10 int i,j,k;
11 int n,m;
12 int main(){
13     while(scanf("%d%d",&n,&m)!=EOF){
14         for(i=1;i<=n;i++)
15                for(j=0;j<=m;j++) dp[i][j]=i;
16
17         for(j=1;j<=n;j++)
18               for(k=1;k<=j;k++)
19                  for(i=2;i<=m;i++)
20                 dp[j][i]=min(dp[j][i],max(dp[k-1][i-1],dp[j-k][i])+1);
21
22         cout<<dp[n][m]<<endl;
23     }
24     return  0;
25 }
时间: 2024-10-10 08:41:48

鸡蛋的硬度的相关文章

openjudge7627 鸡蛋的硬度

描述 最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛.参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法--从高度扔鸡蛋--来 测试鸡蛋的硬度,如果一次母鸡下的蛋从高楼的第a层摔下来没摔破,但是从a+1层摔下来时摔破了,那么就说这只母鸡的鸡蛋的硬度是a.你当然可以找出各种 理由说明这种方法不科学,比如同一只母鸡下的蛋硬度可能不一样等等,但是这不影响XX公司的争霸赛,因为他们只是为了吸引大家的眼球,一个个

COJN 0585 800604鸡蛋的硬度

800604鸡蛋的硬度 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛.参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法--从高度扔鸡蛋--来 测试鸡蛋的硬度,如果一次母鸡下的蛋从高楼的第a层摔下来没摔破,但是从a+1层摔下来时摔破了,那么就说这只母鸡的鸡蛋的硬度是a.你当然可以找出

AcWing1048 鸡蛋的硬度(浅谈两种解法的思考方向)

这是经典的谷歌面试题,也是经典的动态规划问题 根据y总的说法,动态规划问题要划分集合,表示状态 对于这道题,有两个经典的解法,他们的复杂度不同,因为对状态的定义略有不同 1.最常规的思想,设计状态为前i层用j个鸡蛋所能测的最坏情况的最小值是多少 我相信集合的定义很多人能想到,但是状态的定义还需要进行分析 首先,为什么是最坏情况,因为我们不知道鸡蛋什么时候会碎,这是未知的,所以要考虑最坏的情况,而最小值是因为,这是我们能控制的. 所以不能控制的要考虑最坏,能控制的要考虑最好 那么状态转移方程就能定

大楼扔鸡蛋问题(动态规划)

题目链接:poj 3783 题意分析: 经典题,小白书上的一道例题,4+2出了这道原题,我愣是以为是数学题,最后也没做出来.题意是这样的,给你N个鸡蛋(硬度一样),让你测鸡蛋的硬度,测量的方法就是从某栋M层的楼的某一层X上把鸡蛋扔下来,如果鸡蛋碎了,代表他的强度小于X:如果没碎,则强度大于等于X.我们要做的就是不断的从楼上把鸡蛋扔下来,直到找到某一层楼X,从这一层楼扔下来鸡蛋不碎掉,从X+1层扔下来鸡蛋碎掉,那么鸡蛋的强度就是X.如果在M层扔下来鸡蛋也不碎掉,那么鸡蛋的强度为M.问题是,用N个鸡

U4699 鸡蛋

U4699 鸡蛋 0通过 37提交 题目提供者飞翔 标签 难度尚无评定 提交 最新讨论 暂时没有讨论 题目背景 调皮的kkk准备恶搞他的同学兼朋友——你! 题目描述 kkk准备从楼上扔鸡蛋下来砸在lzn身上,让lzn变成“鸡蛋王子”.但是如果鸡蛋没有破裂,辣么就没有什么好玩的了,所以kkk必须知道鸡蛋最少在哪一层楼上扔下来会摔破. kkk为了实验事先买了K个鸡蛋(这些鸡蛋的硬度一样),并来到了一个N层高楼上.每次kkk可以拿着一个鸡蛋从t楼扔下去,并观察鸡蛋有没有摔破.如果鸡蛋在第t层楼没有摔破

POJ 3783 Balls(扔鸡蛋问题——DP动态规划)

传送门 Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 892 Accepted: 588 Description 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-s

经典面试题楼层丢鸡蛋问题的动态规划解法与数学解法

原题: 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度.比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层. 问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点? 注意:只有两个鸡蛋.第一个鸡蛋碎了,第二个鸡蛋只能挨个楼层测试了. 动态规划解法: //height为楼层数 const int maxHeight = 100; int dp[maxHeight + 5] = { 0 }; for (int height = 1; height <= maxHei

扔鸡蛋

Description Jzj要来做一个经典的实验:测试鸡蛋壳的坚硬程度. Jzj正好处于N层高的摩天大楼中,所以通过从某一楼层向下扔鸡蛋来测试鸡蛋壳的坚硬程度. Jzj有M个鸡蛋,所有的鸡蛋硬度都一样.如果鸡蛋从第L层摔下去没有碎,而在L+1层摔碎了,那么称鸡蛋的硬度是L.嗯,反正jzj不喜欢吃鸡蛋,所以不用担心浪费的问题.大楼共有N层高,如果在N层还没有摔碎,就认为硬度是N:如果在第1层就碎了,硬度为0. 虽然jzj不喜欢吃鸡蛋,但是jzj的好朋友yk特别喜欢吃鸡蛋.为了帮好朋友保护可怜的小

8-4讲题

讲了这么几道题 鸡蛋的硬度DNA——POJ2520括号染色按钮 数轴上有N个按钮,第i个按钮按下去后过ti时间会弹起来,走1路程需要1时间,求怎么按可以将所有按钮按下去.N<=1000 COJ3541不要62 在一个正整数中,如果包含4或62则不吉利,求[a,b]内所有吉利的正整数个数beautiful numbers如果一个整数能被它所有的非0整数位整除,则称它是漂亮的,求[a,b]中有多少位是漂亮的三次见苹果