/*
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次的實驗。那麼,我們第一次應該在哪層樓往下扔雞蛋呢?先讓我...