NOI庫7627 雞蛋的硬度

2021-07-05 12:09:34 字數 1540 閱讀 6503

題目:

分析:dp

1.先想乙個簡單問題:只有兩個雞蛋的問題

兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。(參見兩個雞蛋–一道google面試題)

這是典型的動態規劃問題。假設f[n]表示從n層樓找到摔雞蛋不碎安全位置的最少判斷次數。假設第乙個雞蛋第一次從第i層扔下,如果碎了,就剩乙個雞蛋,為確定下面樓層中的安全位置,必須從第一層挨著試,還需要i-1次;如果不碎的話,上面還有n-i層,剩下兩個雞蛋,還需要f[n-i]次(子問題,實體n層樓的上n-i層需要的最少判斷次數和實體n-i層樓需要的最少判斷次數其實是一樣的)。因此,最壞情況下還需要判斷max(i-1,f[n-i])次。

狀態轉移方程:f[n] = min 初始條件: f[0]=0(或f[1]=1)

實際上,兩個雞蛋的情況用數學方程就可以解決,前提是你知道該怎麼扔:

一種想法是第乙個雞蛋折半搜尋,如100層的樓,先從50層扔下去,如果碎了則第二個雞蛋在1~49層樓中自底向上線性搜尋;如果沒碎則第乙個雞蛋再從75層扔。如果這次碎了則第二個雞蛋在51~74層樓中自底向上線性搜尋;如果還沒碎則第乙個雞蛋再從88層扔,依此類推。這種方法不是最優,因為最壞情況下安全位置恰好是49層,需要嘗試50次。

正確的方法是先假設最少判斷次數為x,則第乙個雞蛋第一次從第x層扔(不管碎沒碎,還有x-1次嘗試機會)。如果碎了,則第二個雞蛋在1~x-1層中線性搜尋,最多x-1次;如果沒碎,則第乙個雞蛋第二次從x+(x-1)層扔(現在還剩x-2次嘗試機會)。如果這次碎了,則第二個雞蛋在x+1~x+(x-1)-1層中線性搜尋,最多x-2次;如果還沒碎第乙個雞蛋再從x+(x-1)+(x-2)層扔,依此類推。x次嘗試所能確定的最高樓層數為x+(x-1)+(x-2)+…+1=x(x+1)/2。

比如100層的樓,只要讓x(x+1)/2>=100,得x>=14,最少判斷14次。具體地說,100層的樓,第一次從14層開始扔。碎了好說,從第1層開始試。不碎的話還有13次機會,再從14+13=27層開始扔。依此類推,

2.現在推廣成n層樓,m個雞蛋

還是動態規劃。假設f[n,m]表示n層樓、m個雞蛋時找到摔雞蛋不碎的最少判斷次數。則乙個雞蛋從第i層扔下,如果碎了,還剩m-1個雞蛋,為確定下面樓層中的安全位置,還需要f[i-1,m-1]次(子問題);不碎的話,上面還有n-i層,還需要f[n-i,m]次(子問題,實體n層樓的上n-i層需要的最少判斷次數和實體n-i層樓需要的最少判斷次數其實是一樣的)。

狀態轉移方程:f[n,m] = min 初始條件:f[i,0]=0(或f[i,1]=i),對所有i

**:

#include 

#include

#include

using

namespace

std;

const

int tmax=105,inf=0x3f3f3f3f;

int f[tmax][tmax];

int dp(int n,int m)

int main()

NOI 7627 雞蛋的硬度

7627 雞蛋的硬度 總時間限制 1000ms 記憶體限制 65536kb 描述最近xx公司舉辦了乙個奇怪的比賽 雞蛋硬度之王爭霸賽。參賽者是來自世 界各地的母雞,比賽的內容是看誰下的蛋最硬,更奇怪的是xx公司並不使用什麼精密儀器來測量蛋的硬度,他們採用了一種最老土的辦法 從高度扔雞蛋 來 測試雞蛋...

OpenJudge 7627 雞蛋的硬度

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

OJ7627 雞蛋的硬度 各種dp之4

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