[Algorithm]扔杯問題

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-axtfkfiv-hv.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

問題:git

有一種玻璃杯須要檢測質量。正好有一幢100層的高樓,該種玻璃杯從某一層樓扔下,恰好會碎。github

現給你兩個玻璃杯,問如何檢測出這個杯子的質量,即找到這種玻璃杯在哪一層樓恰好會碎?算法


思路歷程:微信

由於只有兩個玻璃杯,並且會摔碎,只能從區間中往上找,不能往下找,因此不能用二分法。spa

用一個杯子定區間,另外一個杯子定位置,關鍵在於區間怎麼劃分呢?設計

比較常見的思路:先等分區間的扔,再在區間中一層一層地扔,隱含着分段查找的策略。htm

具體操做方式:blog

[1...100]分爲10個區間,先從第10樓扔杯,再從第20樓扔杯,依次杯扔去,若是到某一層碎掉,get

好比60層碎掉了,我再從51樓開始扔,這樣的話應該是比較快了吧?

這個方法快一點不過若是杯子的質量比較好,在99樓纔會恰好碎掉。

這樣最差的狀況下,須要扔(10+9)次才能找到目標樓層。

繼續思考剛纔方法的缺陷,當杯子質量比較差的時候,此方法仍是比較快速的找到樓層。

好比杯子是在19樓恰好碎,我只須要扔11次,

因此咱們的願望是:杯子的質量不管分佈在哪一個查找區間,均可以快速地找到。

因此想到的是能夠「勻」一下剛纔的思路方法。

即:最開始時大膽地扔,而後再慢慢當心地扔。在扔的過程當中逐漸縮小範圍。

具體方法設計:

每次扔的區間減小一層,這樣作能夠保證每一個區間查找的最差次數是同樣的。

那麼最開始在哪一層開始扔呢?

列出方程:x+(x-1)+(x-2)+...+2 >=100

解出: x = 14。


解決方案:

第一個杯子:扔的層數依次是:1四、(14+13)、(14+13+12)、(14+13+12+11)、......

第二個杯子:從當前碎掉杯子區間的上一個區間。好比第一個杯子是在第四個區間即50層碎掉。

則第二個杯子從第三個區間的第二個元素開始扔,即從40層開始扔。就能找到恰好碎掉的樓層。

指望:

0.14*7.5+0.13*8+0.12*8.5+0.11*9+0.1*9.5+0.09*10+0.08*10.5+0.07*11+0.06*11.5+0.05*12+0.04*12.5+0.01*12 = 9.47(次) 

相關文章
相關標籤/搜索