1. 程式人生 > >有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麽怎麽利用手中的兩個球,用什麽最優策略知道這個臨界的層是第幾層?

有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麽怎麽利用手中的兩個球,用什麽最優策略知道這個臨界的層是第幾層?

要求 避免 怎麽 減少 使用 相同 二分 價值 策略

題目有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麽怎麽利用手中的兩個球,用什麽最優策略知道這個臨界的層是第幾層???

  每次肯定是由低的樓層往高的樓層嘗試,直到在樓層f(k),第一個球已經碎掉了,記錄上一個嘗試的樓層為f(k-1),在此樓層,玻璃球不會碎,所以接下來要嘗試 f(k-1)+1,f(k-1)+2,f(k-3)+3, ....,知道有一個樓層碎了,這個樓層就是解啦,最壞的是到達f(k)-1 層。

  接下來的解決方案就很容易想出了:既然第一步(確定臨界段)的投擲數增加不可避免,我們就讓第二步(確定臨界層)的投擲數隨著第一步的次數增加而減少。第一步的投擲數是一次一次增加的,那就讓第二步的投擲數一次一次減少。假設第一次投擲的層數是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層是無意義的,必然會碎,所以無任何測試價值,所以第一次測試點k是1-99中的一個數),解出結果等於14。丟下第一顆雞蛋的樓層就分別是 14 , 27 , 39 , 50 , 60 , 69 , 77 ,84 , 90 , 95 , 99 。

  前面為什麽是f+(f-1)+...+2+1>=99?首先是分段確定臨界段,我們要保證不管雞蛋在哪一個臨界段碎掉進行判斷的次數都是一樣的,所以就需要從下到上每一個段比上一個段的長度少1,同時所有段的長度總和是99(不需要是100 因為如果前面都沒碎那麽就一樣時100了,也不需要在判斷了)。

金子分析:我來解釋一個不等式右側為什麽是99呢,其實使用99還是100最後結果是一樣的,只不過99說明理解的深刻,因為如果你都已經到了99層了,可以玻璃球還是沒有碎,那麽答案就肯定是100啦,所以100就不用猜了,如果面試的時候說一下這個99和100的關系,就說明你夠聰明,至於到底用100還是99,看考官吧,不同的人理解不一樣。

  首次選擇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次的話就要從15開始猜,並且如果107層的話,那麽需要15次。

  比如到27層,玻璃碎了,則要從15開始一層一層的嘗試,比如26是解的話,那麽猜的序列就是 14,27,15,16,17,18,19,20,21,22,23,24,25,26,一共14次。

備註:這題一開始沒看懂,一直在想為什麽不能用二分法,二分法不是最多7次就可以搞定了嗎,然後想了一會才意思到這題說的兩個玻璃球是指,你最多只能用兩個玻璃球來判斷玻璃球碎掉臨界的樓層,如果用二分法,第一步在50樓一扔碎掉了那麽你這時候就糟了,你只能從第一層開始扔了,要進行50次判斷,(如果你接著再在25扔,最後一顆玻璃球再碎掉你就沒有球可以用了)所以二分法在這裏並不好。

這時我們只能像上面一樣想用第一顆球去確定一個區間,然後在區間內從區間底部網上進行判斷就可以了

有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麽怎麽利用手中的兩個球,用什麽最優策略知道這個臨界的層是第幾層?