数形结合彻底解决2个球100层楼摔坏的问题 .
来源:互联网 发布:界面翻译软件下载 编辑:程序博客网 时间:2024/05/21 19:39
题目:有一栋100层高楼,从某一层开始扔下的玻璃球刚好摔坏,现有两个玻璃球,试用最简便的方法确定这个恰好摔坏玻璃球的那层.
这是一道著名的面试题目,仅写出我的思路和解法.
首先从题目得出基本思路
1.第一个球应该低到高试,但不是每层必试.
2.不能有侥幸心理,第二个球在第一个球的区间里每层必试.
上图是简化为10层楼解法。
数字代表楼层,球从原点先右后上的路径对应的方格中的数字进行测试.也就是第一个球测试4\7\9\10层.如果第一个球4层坏了,第二个球测试1\2\3.如果第一个球7层坏了,第二个球测试5\6.依次类推,肯定可以测出最终的层数.这样做摔4次肯定能得出结果,是最优的方案。
如果把上图的每一个层看作一个1*1的正方形.上图就近似一个等腰梯形,面积为4*4/2+4*0.5=10,也就是层数.推广开来,对于边长为N.它所能测试的层数就是N*N/2+N*0.5。
对于M层楼,最优方案只是上图的类推。将1到M按照上图类同的方法排布,并按照先右后上的路径。这肯定是最优解。
也就是N*N/2+N*0.5〉=M。这里只要取得N的最小正整数就是最多的尝试次数。
比如100层。 N*N/2+N*0.5>=100。 解得N的最小正整数解是14。
下面证明解法的正确性:
将实际问题转化为数学模型是解题的一种重要方法。如果是16层楼,有很多人可能很快得到下图一直的结论。
就是先4层4层的试,然后再每层必试,在图中的顺序就是先右后上。这不是最优解,因为如果是15层的坏的话,要试7次。
如下图,根据我的解法得出的16层楼的最优解,最多6次
最优解是怎样的呢?问题已经可以转化为在坐标系的原点出发,只能先右后上的,在相同的面积下,哪一种图形的使得原点到该图形的任意一点的距离的最大值最小。
结论是: 在相同的面积中,直角等腰的三角形到达面上的任意一点的最大距离是最小的。直角等腰三角形的斜边上任意一点到达原点的距离都是一样的,也是直角等腰三角形中距离原点最大的。利用反证法,如果还有比直角等腰三角形更好的图形,必然要挖去斜边上所有的点,但是把这些点放在哪里呢?放在哪里都比现在的位置远。
另外,如果有三个,四个,五个,N各球应该可以类似的推出来。这些我都没有算过,请有兴趣者得到计算公式后发给我,不胜感激。
【该题算法为本人原创,欢迎引用或转载,请务必注明作者及出处,谢谢!。
- 数形结合彻底解决2个球100层楼摔坏的问题
- 数形结合彻底解决2个球100层楼摔坏的问题 .
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65536的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Android 应用方法数不能超过65K的问题
- 彻底解决Fragment重叠的问题
- 【转】彻底解决Android 应用方法数不能超过65K的问题
- 黑马程序员—C#委托
- 开始运行下的所有命令及cmd下常用命令
- 二维数组的二分法查找
- Linux USB 主机端 驱动程序(2.6.28)
- LINQ to Entities 查询二
- 数形结合彻底解决2个球100层楼摔坏的问题 .
- 火柴问题
- 创业之前,先读读这篇文章
- java JList
- [疯狂Java讲义精粹] 第三章|流程控制与数组
- Limit 1 or n choices for the Multiple Selection List Box (InfoPath + SharePoint + JavaScript)
- android源码解析--MessageQueue
- Android修改源代码控制永不锁屏
- 使用阿里云云服务器一年多的感受