在 萬倉一黍 的部落格中看到了「一道有趣的面試題 」這篇文章,文中給出了一種解法,仔細想了一下,發現也可以在常數時間複雜度下解決。
題目:
某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。
例如:有這樣一種方式,第一次選擇在60層扔,若碎了,說明臨界點在60層及以下樓層,這時只有一顆珠子,剩下的只能是從第一層,一層一層往上實驗,最壞的情況,要實驗59次,加上之前的第一次,一共60次。若沒碎,則只要從61層往上試即可,最多只要試40次,加上之前一共需41次。兩種情況取最多的那種。故這種方式最壞的情況要試60次。
解:原題是,已知大樓的高度,求最少的實驗次數。現在為了便於計算,先把題目反過來考慮:
還是上面的實驗,已知進行實驗k次可以得到了臨界樓層,求這個樓的最大高度h。
開始實驗:
第1步:任取乙個樓層h1 (1 =< h1 <= h),用第一顆珠進行實驗,如果珠碎,則用低二顆珠從第一層向上逐層進行實驗,在最壞情況下, 實驗次數為k1=h1 ,即可得到結果。否則,如果第乙個珠碎了,並且 h1!= h 則令 i=2 進行第二步實驗。
第2步:任取乙個樓層hi (hi-1即:
ki = h1 (i=1) (等式 1.1)
ki = (i – 1) + hi - hi-1 (1ki = (n – 1) + h - hn-1 (i=n) (等式 1.3)
將上面的等式按 i=1,2,3…n 相加可得:
k1 + k2 + k3 + … + kn=1 + 2 + 3 + … + (n-1) + h =n*(n-1)/2 + h
即: h = (k1 + k2 + k3 + … + kn) - n*(n-1)/2
因為 k = max(k1, k2, k3, … , kn) 是已知的, 所以當k1 = k2 = k3 = … = kn = k 是 h 取得最大值
所以:
h = n *k - n*(n-1)/2 (等式 1.4)
等式1.3 可以寫成 k = (n – 1) + hn - hn-1 可得
hn - hn-1 = k + 1 – n > 0
即 n所以 n的取直範圍是 1=< n <=k
等式1.4 是關於n的二次函式, 當n = k 時 等式1.4取得最大值,最大值是 :
h = k(k+1)/2 (等式 1.5)
這就求出了 k 次實驗能確定臨界層的最大樓層高度。
下面在把題目正過來,考慮原題:
由等式1.5 , k-1次實驗能確定臨界層的最大樓層高度為h』=k (k-1) /2
則,如果樓層的高度 x 在區間(h』 , h] 範圍內,則最多進行k次實驗即可的到臨界層 。
即
k(k-1)/2 < x <= k(k+1)/2 (不等式 1.6)
將不等式 1.6 各項 × 2 得:
k(k-1) < 2*x <= k(k+1) (不等式 1.7)
而
(k-1)^2 < k(k-1) < k^2 < k(k+1) <(k+1)^2
即,不等式 1.7 所確定的個區間中有且僅有1個完全平方數,則找出與2*x 近似的完全平方數k^2 , 那麼k就是最終的結果。
計算的時候分別算出
k1 = floor( sqrt (2*x))
k2 = ceil(sqrt (2*x))
分別將 k1, k2 帶入不等式 1.6 ,可得到兩個區間,如果x在第乙個區間中則結果是k1, 否則是k2 .
/*c語言原始碼*************************************/#include#includeint fun (int x)
int main()
一道面試題的分析
題目 console.log a var a 1 console.log a function a console.log a var a 3 console.log a function a console.log a a 執行結果 分析 題目中有多個變數宣告和函式宣告,都會提公升,而函式的優先順...
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...