100樓,2只雞蛋

2021-06-01 19:13:06 字數 1476 閱讀 3153

/*

100樓,2只雞蛋,要求用最少次數確定雞蛋可以從多高摔下而不破。

雞蛋和樓容易被人鑽牛角尖,所以換個更普通的命題來討論下:

有m種「越來越差」的環境(編號1至m)

有n個「完全相同」的樣品,樣品在第i種環境下的測試結果有兩種:

成功 樣品完全無損

失敗 樣品損壞,無法再用

性質1:若樣品測試第k種情況時成功,表示所有樣品都能夠通過環境1至k。

性質2:若樣品測試第k種情況時失敗,表示所有樣品都不能通過環境k至m。

要求用最少的次數,測出探針可承受的最差環境編號。

結合性質1、2,可知每次測試的結果都將把未知區域分成兩部分。

假設在用掉了n-1個探針後,成功通過的環境編號最大的為a,失敗的環境編號最小為b

只剩最後乙個探針,為了完成任務,只能從a依次測試到b

不能跳過中間環境,直接測試後面的,因為一旦失敗,就無法確定最差環境。

*/#include #include #include using namespace std;

int const n = 100;

int g_solve[n + 2][n + 2][n + 2];

int min_test_times(int success, int failure, int probe_count)

int unknown_cases = failure - success - 1;

if(unknown_cases <= 1)

if(probe_count == 1)

int min_times = 0x7fffffff;

for(int step = 1, max_step = ceil(unknown_cases * 0.5); step <= max_step; ++step)

}if(segments >= 1)

}if(t < min_times)

}//cout << "d\t" << success << '\t' << failure << '\t' << probe_count << '\t' << min_times << endl;

g_solve[success][failure][probe_count] = min_times;

return min_times;

}void clearcache()}}}

int main()

return 0;

}

結果(樣品個數、所需試驗次數),結果看著「象是正確的」,樣品超過二分查詢所需的個數後再多也不會有提高了:

1       100

2       18

3       11

4       9

5       8

6       7

7       7

8       7

9       7

2個雞蛋100樓問題

兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。最少需要幾次測試,才能得到摔碎雞蛋的樓層?方案如何?對於這個問題,如果從程式設計角度而言,最簡單的思路是用動態規劃的思想來...

100層樓2個雞蛋,如何得知雞蛋能承受幾層的撞擊

有一棟樓共100層,乙個雞蛋從第n層及以上的樓層落下來會摔破,在第n層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出n,並且保證在最壞情況下,最小化雞蛋下落的次數。我們先假設最壞情況下,雞蛋下落次數為x,即我們為了找出n,一共用雞蛋做了x次試驗,那麼,我們第一次應該從哪層樓往下扔雞蛋呢?先讓我們...

100層樓2個雞蛋,如何得知雞蛋能承受幾層的撞擊

有一棟樓共100層,乙個雞蛋從第n層及以上的樓層落下來會摔破,在第n層以下的樓層落下不會摔破。給你2個雞蛋,設計方案找出n,並且保證在最壞情況下,最小化雞蛋下落的次數。我們先假設最壞情況下,雞蛋下落次數為x,即我們為了找出n,一共用雞蛋做了x次的實驗。那麼,我們第一次應該在哪層樓往下扔雞蛋呢?先讓我...