學習筆記 | 測試杯子在哪個樓層破碎的問題

題目描述:有一種玻璃杯質量確定但未知,需要檢測。

  • 有一棟100層的大樓,該種玻璃杯從某一層樓扔下,剛好會碎。
  • 現給你兩個杯子,問怎樣檢測出這個杯子的質量,即找到在哪一層樓剛好會碎?

題目分析:

  • 首先兩個杯子的質量是相同的。
  • 如果杯子從第n層掉下來沒有碎,那麼從第小於n層的任意層丟下去都不會碎。
  • 如果杯子從第n層掉下來碎了,那麼從第大於n層的任意層丟下去都會碎。
  • 一個扔出去但沒有碎的杯子,可以繼續被用於試驗,扔下去碎了的杯子不能使用。
  • 最後找到杯子剛好碎了的樓層一定是在第X-1層扔下去沒碎,加一層在第X層扔下去碎了,所以得到第X層剛好碎。

方案

  1. 二分法:從 50 樓扔下,沒碎的話,再扔 75 樓,再沒碎我扔 88 樓,依次下去貌似很快就可以鎖定樓層。不過,很不巧,第一次從 50 層樓扔下去就碎了,這個時候就只能從 1 層開始慢慢的的一層一層地扔,如果杯子的質量是剛好在 49 層碎掉的話,那麼最差的情況是需要扔 50 次。
  2. 分段查找區間法:核心點:先分區間的扔,再慢慢地一層一層地扔。比如:先從第 10 樓扔,再從第 20 樓扔,依次下去,如果到某一層碎掉,比如 60 層碎掉了,我再從 51 樓開始扔,這樣比前面的二分法更快,因爲即使又很不巧,杯子的質量比較好,在 99 樓纔會剛好碎掉。這樣的話,在這種最差的情況下,也只需要扔 19 次就能找到目標樓層。
  3. 基於數學方程的方法:假設最少嘗試次數爲 x ,那麼,第一個杯子必須要從第 x 層扔下,因爲:如果碎了,前面還有 x - 1 層樓可以嘗試,如果沒碎,後面還有 x-1 次機會。這種方法相當於如果沒碎的話一直在減少往上遞增樓層的層數,剛開始x層,然後x-1層,緊接着x-2、x-3、一直遞減,每次都減少一層往上移動的層數。
  • 如果沒碎,第一個杯子,第二次就可以從 x +(x - 1)層進行嘗試,這裏加上 x - 1,是因爲當此時,第一個杯子碎了,第二個杯子還有可以從 x + 1 到 ( x + (x - 1) - 1 ) 層進行嘗試,有 x - 2 次機會。
  • 如果還沒碎,那第一個杯子,第三次從 x + (x - 1) + (x - 2)層嘗試。不管杯子碎或者沒碎,都有 x - 3 次嘗試機會,依次類推。
  • 那麼經過 x 次的嘗試可以確定最高的樓層爲 x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 。那反過來,當最高樓層是100層,最少需要多少次呢?即 x(x+1)/2 >= 100, 得到 x >= 14 ,最少要嘗試 14 次。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章