待字闺中之鸡蛋挺住体

题目来源,待字闺中,原创@陈利人
,欢迎大家继续关注微信公众账号“待字闺中”

两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋通过最少的次数确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋

方法分析

看到这个题目,最保险的方法就是一层一层试验,但这样只需要一个鸡蛋就可以了。我们现在有两个鸡蛋,完全可以用有更快的方法。

进一步呢?可能试验的方法是二分查找,例如,第一个鸡蛋再50层扔下,如果碎了,第二个鸡蛋从1-49逐层试验;如果没碎,第一个鸡蛋在75层扔下,如果碎了,第二个鸡蛋从51-74逐层试验…但是,这个方法,很容易悲剧,例如,当正好49层是可以安全落下的,需要尝试50次。比只有一个鸡蛋的情况,效果还要差。

上面的分析都是从鸡蛋的角度出发的,想要得到最少的尝试次数,似乎比较难。那如果我们换个角度,从每个高度的楼层来看呢?如果,某个楼层是可以安全落下的,那么最少需要多少次尝试呢?看下面的分析

在我们编程解决问题的过程中,如果遇到最优问题的时候,往往可以先尝试一下动态规划的方法。而动态规划的方法,首要的我们要找到构成这个最优问题的最优子问题。所以,下面的分析,我们首先尝试动态规划的方法,如何解决这个问题,这也是典型的程序员的思路;其次,在众多的问题当中,有不少可以直接归结为数学方程式,如果我们能够写出数学方程式,那么,答案将是更加的简洁、美妙。所以,第二个方法,将尝试如果总结出数学方程式。

基于动态规划的方法

前面提到,若要采用动态规划的方法,最重要的是要找到子问题。做如下的分析,假设f{n}表示从第n层楼扔下鸡蛋,没有摔碎的最少尝试次数。第一个鸡蛋,可能的落下位置(1,n),第一个鸡蛋从第i层扔下,有两个情况:

  1. 碎了,第二个鸡蛋,需要从第一层开始试验,有i-1次机会
  2. 没碎,两个鸡蛋,还有n-i层。这个就是子问题了f{n-i} 所以,当第一个鸡蛋,由第i个位置落下的时候,要尝试的次数为1 + max(i - 1, f{n - i}),那么对于每一个i,尝试次数最少的,就是f{n}的值。状态转移方程如下: f{n} = min(1 + max(i - 1, f{n - 1}) ) 其中: i的范围为(1, n), f{1} = 1 完毕。

代码如下:

int TwoEgg(int n)
{
	vector<int> dp(n+1,0);
	int i,j;
	for(i=1;i<=n;i++)//对于每一层
	{
		dp[i] = i;
		for(j=1;j<=i;j++)
		{
			dp[i] = min(max(j-1,dp[i-j])+1,dp[i]);//动态转移方程
		}
	}
	return dp[n];
}

推广

动态规划的方法,可以推广为n层楼,m个鸡蛋。如下分析: 假设f{n,m}表示n层楼、m个鸡蛋时找到最高楼层的最少尝试次数。当第一个鸡蛋从第i层扔下,如果碎了,还剩m-1个鸡蛋,为确定下面楼层中的安全楼层,还需要f{i-1,m-1}次,找到子问题;不碎的话,上面还有n-i层,还需要f[n-i,m]次,又一个子问题。 状态转移方程如下: f{n, m} = min(1 + max(f{n - 1, m - 1}, f{n - i, m}) ) 其中: i为(1, n), f{i, 1} = 1

代码如下:

int MEgg(int n,int m)//n个层,m个鸡蛋
{
	int i,j,k,MAX = numeric_limits<int>::max();
	int** dp = new int*[n+1];
	for(i=0;i<=n;i++)
	{
		dp[i] = new int[m+1];
	}
	memset(dp[0],0,sizeof(int)*(m+1));
	for(i=1;i<=n;i++)dp[i][1] = i;//初始化
	for(i=1;i<=n;i++)//每一层
	{
		for(j=2;j<=m;j++)//对于k个鸡蛋
		{
			dp[i][j] = i;
			for(k=1;k<=i;k++)//从k层开始下落
			{
				dp[i][j] = min(max(dp[k-1][j-1],dp[i-k][j])+1,dp[i][j]);
			}
		}
	}
	int res = dp[n][m];
	for(i=0;i<=n;i++)delete[] dp[i];
	delete[] dp;
	return res;
}

基于数学方程的方法

假设最少尝试次数为x,那么,第一个鸡蛋必须要从第x层扔下,因为:如果碎了,前面还有x - 1层楼可以尝试,如果没碎,后面还有x-1次机会。如果没碎,第一个鸡蛋,第二次就可以从x +(x - 1)层进行尝试,为什么是加上x - 1,因为,当此时,第一个鸡蛋碎了,第二个鸡蛋还有可以从x+1 到 x + (x - 1) - 1层进行尝试,有x - 2次。如果还没碎,那第一个鸡蛋,第三次从 x + (x - 1) + (x -
2)层尝试。碎或者没碎,都有x - 3次尝试机会,依次类推。那么,x次的最少尝试,可以确定的最高的楼层是多少呢? x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 那反过来问,当最高楼层是100层,最少需要多少次呢?x(x+1)/2 >= 100, 得到x>=14,最少要尝试14次。

待字闺中之鸡蛋挺住体

时间: 2024-11-05 17:21:12

待字闺中之鸡蛋挺住体的相关文章

上海的同志们挺住!又有3个坏消息要告诉你们!

上海的同志们务必挺住啊! 又有3个坏消息 这日子真的是没法过了 第一个坏消息 上海半个月都处于尿失禁模式 根据气象预报 上海未来半个月里 基本上是看不到阳光明媚了... 上海小伙伴们都看到了吗 这就是上海未来的天气预报 很抱歉小编只看到雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨雨ヽ.ヽ'. ヽ .ヽ'.ヽ.ヽ .ヽ'.ヽ.ヽ'.ヽ.ヽ'.ヽ.ヽ'.ヽ.ヽ'.ヽ.ヽ'.ヽ.'.ヽ.ヽ'. ヽ.ヽ'.ヽヽ.ヽ'.ヽ ヽ.ヽ.ヽ'. ヽ .

百科知识 什么是tvb体

tvb体 百科名片 TVB体,是指大量套用TVB电视剧中的经典台词来"吐槽"或者寻求"安慰",这种新的网络文体被赞语言平实却"很疗伤",成为新的"吐槽"方式并在网络上走红,受网友追捧. ?? 继Hold住体.蓝精灵体之后,一种新的吐槽体又在网络上悄然走红.TVB体的来源据说是在网上有人发了这样一个帖子:"我找不到男朋友,大家可不可以用TVB语气安慰我一下.马上有回复:发生这种事,大家都不想的.感情的事呢,是不能强求的

美好生活

做人 自信.乐观.积极.努力.向上自信.乐观来源于积极,要想要能够积极你必须努力,努力之后你就能大胆的积极了,积极达到成效之后一方面达到了向上的目的,并且这成效另一方面促进了你的自信,乐观.由此看来,努力是很重要的 做事 做事其实没有必要这么急躁,一步一个脚印要做到心里不急,但手头上要急,不断去实践和面对,逼着自己离开自己的舒适区,勇敢跨出第一步,提高自己的心理素质和科学文化知识,一切都在自己掌握之中,你会发现人生因为有挑战而变得更加美好.要有计划,有组织,讲究方法,不必事无巨细,但要注意细节,

&lt;老友记&gt;学习笔记

这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的情路坎坷,事业成败和生活中的喜怒哀乐,无时无刻不牵动着彼此的心,而正是正平凡的点点滴滴,却成为最令人感动与留恋的东西. 人物:1.瑞秋•格林(RACHEL GREENE)由珍妮佛•安妮斯顿(Jennifer Aniston)扮演 瑞秋是莫妮卡的高中同学,在与牙医未婚夫的婚礼上脱逃至莫妮卡处. 2.罗

主持人如何练发声?

播音专业:表演,声乐,节目主持人概论,新闻写作,普通话水平测度,化妆学,主持人能力培训,篮球,电视前辑,视听语言.播音主持概论.新闻学概论.传播学概论:3.专业基础课,包括普通话语音.发声基础.语言表达能力.如果所学为配音专业.双语播音专业等,还会开设相应的配音课程.新闻英语听力.英语口语表达等.4.实践课,以播音实践为主,包括影视化妆.形体课.各类主持课程.表演课程.播音导论.播音发声学.播音技巧.主持艺术.礼仪形体学.艺术概论.新闻概论.大众传播学.节目策划.表演.声乐.电视导播.中国传媒大

关于金鱼腹水

大晚上的,有人愿意听我唠叨自己治愈2只金鱼腹水炸鳞病的经验吗? 记得刚刚开始养金鱼的时候在网上看到这种病鱼的图片,第一反应是头皮发麻,第二反应是死也想不通∶金鱼这种人畜无害的生物,为什么会得这么恐怖的病呢?虽然在此后的日子里我一直在心里暗暗祈祷老天照顾,永远不要让我碰到这么可怕的状况,但是俗话说得好:常在河边溜达没有不湿鞋的,老是走夜路没有不遇鬼的,一直养金鱼没有不遇见腹水立鳞病的自今年4月重新开缸养了金鱼以后,楼主终于遇到了敬畏已久的腹水立鳞病,而且半年之内发生了2 次.但是不知道该说楼主RP

你写程序再牛,也未必懂我写的文章!

[导语]如果你觉得这篇文章是喊口号,那你就错了.前面写的很多文章,其实都是一步步写上来的,内容上有连贯性,但分章阅读也影响不大.很多内容谈到心,心强大,无坚不摧.心态.视野.格局等等,这些东西说再多,对不同的人,效果也不一样,其原因是心有不同. 一.大道甚夷,其人好径 这句话来自老子<道德经>,老子要表达的真正意思,肯定不是我写的这篇文章理解的那样,我说的只是最肤浅的'望文生义'.老子说的大道,其实是体道.悟 道.行道的正确方向.意思是说人们体道,然后悟道,然后行道,这个通向道的路其实很平坦,

Linux之进程的等待与其内核实现解析

进程通过fork产生子进程,进程也会死亡,进程退出的时候将会进行内核清理,释放所有进程的资源,资源包括:内存资源,文件资源,信号量资源,共享内存资源,或者引用计数减一,或者彻底释放. 不过进程的退出并没有把所有资源释放,保留一一些资源,比如进程的PID依然被占用,不可被分配,来看看僵尸进程依旧占有的资源:进程控制块task_struct ,内核栈等.这些资源不释放是为了提供一些重要信息,比如进程为何退出,退出码是多少,收到信号退出还是正常退出等,像墓志铭一样总结僵尸进程的一生,一般是由父进程收集

我心有猛虎,细嗅蔷薇下

兄弟连PHP培训学校是我经历过最放心的学校,我曾经历好几个被换走N个班主任的班级,老师的好坏,听一节就大致了解了. 从决定到来LAMP兄弟来只用了半天的时间,时间非常仓促,以至于我下了火车,站在北京西站茫然环顾,都觉得一切都是幻觉,像是在做梦. 经历很多的人和事的变化,让我发现,自己的目前的现状与我想要的状态已经产生了巨大鸿沟,而且这道鸿沟正在渐渐变大.改变现状成了我内心最大的冲动了. 来到兄弟连后,见到第一个人说的第一句话顿时让我忐忑的心情被安抚下去:你是新来的兄弟吧? 3.28号经历开班仪式