雞蛋的硬度

2021-08-14 05:17:40 字數 1505 閱讀 9561

有乙個傻x無聊的公司用扔雞蛋的辦法測試雞蛋硬度,求最壞情況要扔幾次,只能從第一層扔到第n層,如果這個雞蛋在第n層沒碎,在n+1層碎了,這個雞蛋的硬度就是n。然後多事的小a又想著用二分,結果想到自己都煩還在想。(無聊的小a)然後又讓你幫他解決問題。

【輸入】

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

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

【輸出】

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

【輸入樣例】

100 1

100 2

【輸出樣例】

100

14其實就是記憶化搜尋

先要處理好邊界問題吧:

if (m==1) return f[n][m]=n; //如果只有乙個雞蛋,那只能扔n次,不然直接碎了就沒機會了。

if (m==0) return f[n][m]=0; //沒有雞蛋扔個皮皮蝦

if (n==1) return f[n][m]=1; //只有一層樓還用說嗎?就算這個雞蛋的硬度是10^1000000,還是只能測出來是1。

if (n==0) return f[n][m]=0; //樓都沒有扔個皮皮蝦。

好了,邊界處理好了

重點來了

你們最想要的動態轉移方程 f[

n][m

]=mi

n(f[

n][m

],1+

max(

dp(i

−1,m

−1),

dp(n

−i,m

)));

//i=

1..n

f [n

][m]

=min

(f[n

][m]

,1+m

ax(d

p(i−

1,m−

1),d

p(n−

i,m)

));/

/i

=1..

n

#include

#include

#define inf 0x3f

#define r(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

int n,m,ans,f[101][101];

int max(int x,int y)

int min(int x,int y)

int dp(int n,int m)

int main()

雞蛋的硬度(線性dp)

題目描述 最近xx公司舉辦了乙個奇怪的比賽 雞蛋硬度之王爭霸賽。參賽者是來自世界各地的母雞,比賽的內容是看誰下的蛋最硬,更奇怪的是xx公司並不使用什麼精密儀器來測量蛋的硬度,他們採用了一種最老土的辦法 從高度扔雞蛋 來測試雞蛋的硬度,如果一次母雞下的蛋從高樓的第a層摔下來沒摔破,但是從a 1層摔下來...

NOI庫7627 雞蛋的硬度

題目 分析 dp 1.先想乙個簡單問題 只有兩個雞蛋的問題 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。參見兩個雞蛋 一道google面試題 這是典型的動態規劃問題。...

OpenJudge 7627 雞蛋的硬度

描述 最近xx公司舉辦了乙個奇怪的比賽 雞蛋硬度之王爭霸賽。參賽者是來自世 界各地的母雞,比賽的內容是看誰下的蛋最硬,更奇怪的是xx公司並不使用什麼精密儀器來測量蛋的硬度,他們採用了一種最老土的辦法 從高度扔雞蛋 來 測試雞蛋的硬度,如果一次母雞下的蛋從高樓的第a層摔下來沒摔破,但是從a 1層摔下來...