[益智]:从高楼抛玻璃球,用什么最优策略得到临界层?

题目描述

有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层???

题目解答

  • 方法一:

只用1个球就可以了,从2楼开始扔,如果直接摔碎,说明1层是最优解;没碎的话就一直扔,直到球从第x层扔下破碎,所以临界层就是x-1层。

在最坏情况下,这个方法需要扔100次。

  • 方法二:

采用类似于二分查找的方法,把鸡蛋从一半楼层(50层)往下扔。
如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。
如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔…

这个方法在最坏情况下,需要尝试50次。

  • 方法三:

每次肯定是由低的楼层往高的楼层尝试,直到在楼层f(k),第一个球已经碎掉了,记录上一个尝试的楼层为f(k-1),在此楼层,玻璃球不会碎,所以接下来要尝试 f(k-1)+1,f(k-1)+2,f(k-3)+3, …,直到有一个楼层碎了,这个楼层就是解啦,最坏的是到达f(k)-1 层。(核心思想)

所以可以进行区间的划分:划成10份。(1份10个),最多也就是扔不到20次。

最好情况是在第10层碎掉,尝试次数为 1 + 9 = 10次。
最坏的情况是在第100层碎掉,尝试次数为 10 + 9 = 19次。

不过,这里有一个小小的优化点,我们可以从15层开始扔,接下来从25层、35层扔…一直到95层。

这样最坏情况是在第95层碎掉,尝试次数为 9 + 9 = 18次。

  • 方法四:(最优)

既然第一步(确定临界段)的投掷数增加不可避免,我们就让第二步(确定临界层)的投掷数随着第一步的次数增加而减少。第一步的投掷数是一次一次增加的,那就让第二步的投掷数一次一次减少。

  假设第一次投掷的层数是f,转化成数学模型,f+(f-1)+…+2+1就表示从f开始猜,每次的增量都比前一次的曾量减1的情况下,最后猜的那个数(即 f+(f-1)+…+2+1 ),按照提议要求f+(f-1)+…+2+1>=99,即f(f+1)/2>=99(第一次测试点选择100层是无意义的,必然会碎,所以无任何测试价值,所以第一次测试点f是1-99中的一个数),解出结果等于14。丢下第一颗鸡蛋的楼层就分别是 14 , 27 , 39 , 50 , 60 , 69 , 77 ,84 , 90 , 95 , 99 。

前面为什么是f+(f-1)+…+2+1>=99?首先是分段确定临界段,保证不管玻璃球在哪一个临界段碎掉进行判断的次数都是一样的,所以就需要从下到上每一个段比上一个段的长度少1,同时所有段的长度总和是99(不需要是100 因为如果前面都没碎那么就一样时100了,也不需要在判断了)。

分析:

假设最优的尝试次数的x次,为什么第一次扔就要选择第x层呢?
这里的解释会有些烧脑,请小伙伴们坐稳扶好:

  • 假设第一次扔在第x+1层:

如果第一个玻璃球碎了,那么第二个玻璃球只能从第1层开始一层一层扔,一直扔到第x层。
这样一来,我们总共尝试了x+1次,和假设尝试x次相悖。由此可见,第一次扔的楼层必须小于x+1层。

  • 假设第一次扔在第x-1层:

如果第一个玻璃球碎了,那么第二个玻璃球只能从第1层开始一层一层扔,一直扔到第x-2层。
这样一来,我们总共尝试了x-2+1 = x-1次,虽然没有超出假设次数,但似乎有些过于保守。

  • 假设第一次扔在第x层:

如果第一个玻璃球碎了,那么第二个玻璃球只能从第1层开始一层一层扔,一直扔到第x-1层。
这样一来,我们总共尝试了x-1+1 = x次,刚刚好没有超出假设次数。

因此,要想尽量楼层跨度大一些,又要保证不超过假设的尝试次数x,那么第一次扔鸡蛋的最优选择就是第x层。

  首次选择14,那么最高可以判断到呢,按照上面的递减数列,14 , 27 , 39 , 50 , 60 , 69 , 77 ,84 , 90 , 95 , 99 ,102,104,105。一共是14次,最后是到105了,按照上面99和100的分析,虽然是14次猜,但是最后一个猜到了105,可知如果105还是不碎的话,那么肯定是106,106是铁定的了,不用猜了就知道,所以14次最大可以判断到106,这样15次的话就要从105开始猜,并且如果107层的话,那么需要15次。

  比如到27层,玻璃碎了,则要从15开始一层一层的尝试,比如26是解的话,那么猜的序列就是 14,27,15,16,17,18,19,20,21,22,23,24,25,26,一共14次。


备注:

这题一开始没看懂,一直在想为什么不能用二分法,二分法不是最多7次就可以搞定了吗,然后想了一会才意思到这题说的两个玻璃球是指,你最多只能用两个玻璃球来判断玻璃球碎掉临界的楼层,如果用二分法,第一步在50楼一扔碎掉了那么你这时候就糟了,你只能从第一层开始扔了,要进行50次判断,(如果你接着再在25扔,最后一颗玻璃球再碎掉你就没有球可以用了)所以二分法在这里并不好。

这时我们只能像上面一样想用第一颗球去确定一个区间,然后在区间内从区间底部网上进行判断就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值