本文主要是介绍百层高塔扔鸡蛋问题新思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
百层高塔扔鸡蛋问题新思路
题目
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。 最少需要几次测试,才能得到摔碎鸡蛋的楼层?方案如何?
原文链接:http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html
本文的思路为原创,思路与原文思路完全不同,如有发现讲解有问题,请留言指出,谢谢~
问题解析
这是一个不确定问题的分析,既然是不确定,那么我们只能考虑最差的情况,只要保障证最差情况下能完成任务,那么问题就得到了解决。我说这句话什么意思呢?举个例子:
假如我们第一次测试把鸡蛋在50层扔下时鸡蛋破了;那么此时我们只剩下一个鸡蛋,这个时候,为了保证我们一定能够测出鸡蛋刚好在哪一层能破,我们只能从第一层,一层一层网上尝试。最坏的情况就是鸡蛋刚刚好在49层摔破,这时候我们一共尝试了50次。这就是这种情况下最坏的情况了。假如没有破,那么问题就 转化成了重新尝试100-50层的问题了。依次类推。
所以我们假设在最少需要测试的次数时,第一次选的楼层是k(1<=k<=100)层,那么此时有两种结果:
1:鸡蛋没破碎
2:鸡蛋碎了
此时我们可以用如下图表示:
假如鸡蛋破了,我们需要一层一层的尝试,总共需要尝试k次:
假如鸡蛋没破,问题就转换成了最初的问题了,只不过楼层由100层减少到了100-k层,递归进行下去:
一次递归下去,知道还剩下1层楼:
我们可以看出,这是一颗二叉树,每一个节点就是我们尝试扔的楼层,树的深度,就是我们需要尝试的次数,而这颗树的总节点数,就是最大楼层数。
观察这棵树的特点,每一层的节点数都比上一层的节点数多一个,并且这一层的节点数和当前层数相等。所以为什么保证在任何最坏的情况下,我们都能在比较少的次数中尝试出最佳扔鸡蛋的楼层,我们要保证树的每一个分支的深度都尽可能的浅,也就是让这棵树的深度尽可能的浅。我们设当前树的最大深度为n,所以可以得出:1+2+3+...+n>=100
,即(1+n)*n/2>=100
。得到n的最小值为14。
所以我们至少需要尝试14次。
这篇关于百层高塔扔鸡蛋问题新思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!