尋找臨界樓層 面試難題

2021-06-09 23:17:51 字數 852 閱讀 6349

問題1 :

問題2 :

題目:乙個100層的大廈,你手中有兩個相同的雞蛋(玻璃球或圍棋)。從這個大廈的某一層扔下雞蛋((玻璃球或圍棋))就會碎,用你手中的這兩個雞蛋(玻璃球或圍棋),找出乙個最優的策略,來得知那個臨界層面。

這種問題  一般讓人想到用二分的解法,但是二分法的最大深度為logn,那麼石頭有限如何選擇合適的拋石頭層數則是很重要的。

網上目前主流解法就是動態規劃,因此我好好學習學習相關知識。我看了解法 覺得 動態規劃解決 這種問題 最優解  就是處理  **扔可以保證扔的次數最少。

樓層 有n個,球有k 個

f(n,k) = min+1, 1=這個的意思 就是f(n,k)的含義  n層樓 k個球最少次數確定臨界層

其實 r就是用來表示 我從哪一層開始探測,當然需要考慮 從第一層到第n層中的某乙個來開始處理。

情況 假設從第r層 開始扔

如果 球碎了 ,那麼 一定在1 - r層必有一層為臨界 剩k-1個球

如果 球未碎,那麼一定 在r+1-n層必有一層為臨界 剩 k個球

當然 在計算f(n,k)是 我需要按最壞情況考慮 ,如果 在 1-r-1層扔的次數 多於  r-n層 我需要記錄的次數 當然為f(r,k-1)反之亦然。

好了基於這個思想來code

#define max 1024

#define min 0x7fffffff

#define num 10

int f[max][num];

void find(int n, int k)

f[j][i] = min;

} }}int main()