一个有趣的问题
2016-04-13 23:42
267 查看
前言
这个问题来自于看到的一个面试题,其中的解题过程比较有趣,有很多值得借鉴的地方,这里写出来作为记录。
题目
假设一栋100层的楼,两个完全一样的鸡蛋。存在某一层N,当鸡蛋从大于或等于N的楼层落下时会碎掉,当鸡蛋从小于N层落下时不会碎。问用两个鸡蛋找到N的最佳方案,以及此时最坏情况下需要实验几次。
非完美的5分解决方案:
解决方案一的灵感来自于已知两数的和,求两数的平方和的最小值。即假设两数和为25,求两数的平方和的最小值和最大值。
这个解法比较简单,直接设一个数位x,则另一个数为(25-x),两数的平方和为 x2 + (x-25)2 = 2x2 - 50x + 625 = 2(x - 12.5)2 + n 可以只当x为12.5的时候取得最小值。当x为25的时候取得最大值。由此可以猜想是否可将100分成10等份,每一等份的层数正好为10层(跟前面的题目没有任何关联,只是一种第六感)。此时方案就是分别从第10层,20层,30层.. 丢第一个鸡蛋,直到第一个鸡蛋碎掉。然后从碎之前的一次丢位子的后面一层开始一直往上一层丢,直到找到刚好第二个蛋碎的位置。此时最坏情况下需要试18次。
完美的解决方案:
我们可以假设最坏的情况下需要丢x次鸡蛋。假设刚开始应该在第y层开始丢。此时第一次如果鸡蛋碎了,那么最坏的情况下找到N还需要丢y-1次。所以此时有 1 + y - 1 = x; 可以得到开始应该在第x层丢。假设第一次丢蛋没碎,那么第二次丢肯定要在x层之上丢,假设第二次丢的层数比第一次丢的高z层,同第一次一样假设第二次丢鸡蛋碎了, 那么最坏的情况下找到N需要的次数应该是: 1 + 1 + z - 1 =x; 可以得到 z = x - 1;也就是第二次应该比第一次丢的楼层高x-1层。依此类推知道最后一次就能断定是否是N。所以有下面等式:
x + (x-1) + ... + 1 >= 100
解上面的不等式得 x = 14. 所以完美的解决方案丢的层数应该依次是: 14, 27, 39, 50, 59, 67, 84, 90, 95, 99, 100. 最坏的情况下需要测试14次。
这个问题来自于看到的一个面试题,其中的解题过程比较有趣,有很多值得借鉴的地方,这里写出来作为记录。
题目
假设一栋100层的楼,两个完全一样的鸡蛋。存在某一层N,当鸡蛋从大于或等于N的楼层落下时会碎掉,当鸡蛋从小于N层落下时不会碎。问用两个鸡蛋找到N的最佳方案,以及此时最坏情况下需要实验几次。
非完美的5分解决方案:
解决方案一的灵感来自于已知两数的和,求两数的平方和的最小值。即假设两数和为25,求两数的平方和的最小值和最大值。
这个解法比较简单,直接设一个数位x,则另一个数为(25-x),两数的平方和为 x2 + (x-25)2 = 2x2 - 50x + 625 = 2(x - 12.5)2 + n 可以只当x为12.5的时候取得最小值。当x为25的时候取得最大值。由此可以猜想是否可将100分成10等份,每一等份的层数正好为10层(跟前面的题目没有任何关联,只是一种第六感)。此时方案就是分别从第10层,20层,30层.. 丢第一个鸡蛋,直到第一个鸡蛋碎掉。然后从碎之前的一次丢位子的后面一层开始一直往上一层丢,直到找到刚好第二个蛋碎的位置。此时最坏情况下需要试18次。
完美的解决方案:
我们可以假设最坏的情况下需要丢x次鸡蛋。假设刚开始应该在第y层开始丢。此时第一次如果鸡蛋碎了,那么最坏的情况下找到N还需要丢y-1次。所以此时有 1 + y - 1 = x; 可以得到开始应该在第x层丢。假设第一次丢蛋没碎,那么第二次丢肯定要在x层之上丢,假设第二次丢的层数比第一次丢的高z层,同第一次一样假设第二次丢鸡蛋碎了, 那么最坏的情况下找到N需要的次数应该是: 1 + 1 + z - 1 =x; 可以得到 z = x - 1;也就是第二次应该比第一次丢的楼层高x-1层。依此类推知道最后一次就能断定是否是N。所以有下面等式:
x + (x-1) + ... + 1 >= 100
解上面的不等式得 x = 14. 所以完美的解决方案丢的层数应该依次是: 14, 27, 39, 50, 59, 67, 84, 90, 95, 99, 100. 最坏的情况下需要测试14次。
相关文章推荐
- weblogic 停在starting状态的解决办法
- 微信开发获取AccessToken的方式
- 20145118 《Java程序设计》 实验报告二
- Ant counting
- sbt与maven简单对比
- 并查集——A bug s life
- 设计模式之Builder模式
- 十条非常有用的jQuery代码片段
- “耐撕”2016.04.13站立会议
- ”单元测试“理解与感悟
- angular(指令--restict匹配模式)
- 2016年的个人要做的事儿
- full backup of Linux OS
- Windows下MySQL5.6以上版本不能用localhost和127.0.0.1连接问题
- iOS - 百度地图
- springmvc集成mongo
- 使用数组实现堆栈和队列
- [J2EE学习][post,get乱码处理]
- [J2EE学习][post,get乱码处理]
- C++ 中Traits技术 (1) —— 初识