[Algorithm]扔杯问题

原文地址: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次。

猜你喜欢

转载自www.cnblogs.com/strengthen/p/10957673.html