原文地址:https://www.cnblogs.com/strengthen/p/10957673.html
问题:
有一种玻璃杯质量确定但未知,需要检测。
有一栋100层的大楼,该种玻璃杯从某一层楼扔下,刚好会碎。
现给你两个杯子,问怎样检测出这个杯子的质量,即找到在哪一层楼刚好会碎?
思路历程:
因为杯子会碎,只能往上找,不能往下找,所以不能用二分搜索。
一个杯子定区间,一个杯子定位置,关键在于区间怎么划分。
比较常见的方法是,先分区间的扔,再慢慢地一层一层地扔,隐含着分段查找的策略。
具体操作方式:
先从第10楼扔,再从第20楼扔,依次下去,如果到某一层碎掉,
比如50层碎掉了,我再从41楼开始扔,这样的话应该算是比较快了把?
这个方法是要快一点不过如果我杯子的质量比较好,在99楼才会刚好碎掉。
这样,最差的情况下,需要扔19次才能找到目标楼层。
继续思考刚才方法的缺陷,当杯子质量比较差的时候,此方法还是比较快速的找到的。
比如杯子是在19楼刚好碎,我只需要扔11次,比99楼刚好碎的情况要少很多次。
所以我们的愿望是:杯子的质量无论分布在哪个查找区间,都可以快速地找到。
所以我想到的是可以“匀”一下刚才的方法。即最开始我需要大胆地扔,然后再慢慢小心地扔。
具体方法设计:
每次扔的区间减少一层,这样做可以保证每个区间查找的最差次数是一样的。
假定第一步在15楼扔,没碎的话则下一步在29楼扔,
没碎下一步在42楼扔....碎掉之后则在上一次没碎的楼层开始向上扔。
那么最开始在哪一层开始扔呢?
列出方程:x+(x-1)+(x-2)+...+2 >=100
解出: x = 14。
解决方案:
最开始从14楼开始扔,没碎的话在27楼扔,再没碎的话在39楼扔.....一旦碎掉,
则从上一次没碎的楼层逐层往上扔,即可快速确认杯子在哪一层刚好会碎掉。
这样的方法可以保证在最差的情况下也能在14次内找到楼层,平均需要的次数不到10次。