第九章 動態規劃 1300 雞蛋的硬度

2021-10-05 14:28:49 字數 1763 閱讀 2335

1300:雞蛋的硬度

時間限制: 1000 ms 記憶體限制: 65536 kb

【題目描述】

最近xx公司舉辦了乙個奇怪的比賽:雞蛋硬度之王爭霸賽。參賽者是來自世界各地的母雞,比賽的內容是看誰下的蛋最硬,更奇怪的是xx公司並不使用什麼精密儀器來測量蛋的硬度,他們採用了一種最老土的辦法–從高度扔雞蛋–來測試雞蛋的硬度,如果一次母雞下的蛋從高樓的第a層摔下來沒摔破,但是從a+1層摔下來時摔破了,那麼就說這只母雞的雞蛋的硬度是a。你當然可以找出各種理由說明這種方法不科學,比如同一只母雞下的蛋硬度可能不一樣等等,但是這不影響xx公司的爭霸賽,因為他們只是為了吸引大家的眼球,乙個個雞蛋從100 層的高樓上掉下來的時候,這情景還是能吸引很多人駐足**的,當然,xx公司也絕不會忘記在高樓上掛一條幅,寫上「xx公司」的字樣–這比賽不過是xx 公司的乙個另類廣告而已。

勤於思考的小a總是能從一件事情中發現乙個數學問題,這件事也不例外。「假如有很多同樣硬度的雞蛋,那麼我可以用二分的辦法用最少的次數測出雞蛋的硬度」,小a對自己的這個結論感到很滿意,不過很快麻煩來了,「但是,假如我的雞蛋不夠用呢,比如我只有1個雞蛋,那麼我就不得不從第1層樓開始一層一層的扔,最壞情況下我要扔100次。如果有2個雞蛋,那麼就從2層樓開始的地方扔……等等,不對,好像應該從1/3的地方開始扔才對,嗯,好像也不一定啊……3個雞蛋怎麼辦,4個,5個,更多呢……」,和往常一樣,小a又陷入了乙個思維僵局,與其說他是勤於思考,不如說他是喜歡自找麻煩。

好吧,既然麻煩來了,就得有人去解決,小a的麻煩就靠你來解決了:)

【輸入】

輸入包括多組資料,每組資料一行,包含兩個正整數n和m(1≤n≤100,1≤m≤10),其中n表示樓的高度,m表示你現在擁有的雞蛋個數,這些雞蛋硬度相同(即它們從同樣高的地方掉下來要麼都摔碎要麼都不碎),並且小於等於n。你可以假定硬度為x的雞蛋從高度小於等於x的地方摔無論如何都不會碎(沒摔碎的雞蛋可以繼續使用),而只要從比x高的地方扔必然會碎。

對每組輸入資料,你可以假定雞蛋的硬度在0至n之間,即在n+1層扔雞蛋一定會碎。

【輸出】

對於每一組輸入,輸出乙個整數,表示使用最優策略在最壞情況下所需要的扔雞蛋次數。

【輸入樣例】

100 1

100 2

【輸出樣例】

10014

【提示】

最優策略指在最壞情況下所需要的扔雞蛋次數最少的策略。

如果只有乙個雞蛋,你只能從第一層開始扔,在最壞的情況下,雞蛋的硬度是100,所以需要扔100次。如果採用其他策略,你可能無法測出雞蛋的硬度(比如你第一次在第二層的地方扔,結果碎了,這時你不能確定硬度是0還是1),即在最壞情況下你需要扔無限次,所以第一組資料的答案是100。

思路:f[i][j]表示從第i層,用j個蛋試,用的最小次數,f[i][j]並不是一定在第i層去扔,可以在1 ~ i中任意一層扔乙個蛋,因此可以用乙個迴圈變數k,k從1 ~ i,對於當前的k,這個雞蛋扔下去有兩種情況:碎和不碎。如果碎掉,那此時只有j-1個蛋,要試1~k-1層,即是f[k-1][j-1]; 如果不碎,還有j個蛋,那麼就要考慮k+1~i層,這等效於f[i-k][j]。所以f[i][j]=min(f[i][j],max(f[k-1][j-1],f[j-k][j])+1)。

#include

#include

#include

using

namespace std;

int dp[

1010][

110]

;int i,j,k;

int n,m;

intmain()

return0;

}

第九章 動態規劃 1305 Maximum sum

輸入樣例 110 1 1 2 2 3 3 4 4 5 5 輸出樣例 13 提示 就是求最大子段和問題,樣列取2,2,3,3,4和5,baidu搜poj 2479 maximum sum,可獲得大量經典最大子段和問題的題目解析,本題o n2 演算法超時,必須用o n 演算法。思路 從左到右分別求出它們...

第九章 動態規劃 1301 大盜阿福

1301 大盜阿福 時間限制 1000 ms 記憶體限制 65536 kb 提交數 3388 通過數 1400 題目描述 阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。這條街上一共有 n 家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街...

C語言 第九章動態記憶體

手動申請 手動釋放 什麼時候使用動態記憶體 1.儲存比較大的資料量時 2.記憶體大小可以變化時 include void malloc size t size 申請size個位元組的動態記憶體 返回申請到的動態記憶體的起始位址 如果申請失敗返回 nullvoid calloc size t nmem...