x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。
x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當於我們的2樓。
如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7
。特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0
。如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n
為了減少測試次數,從每個廠家抽樣3部手機參加測試。
某次測試的塔高為1000層,如果我們總是採用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢?
請填寫這個最多測試次數
注意:需要填寫的是乙個整數,不要填寫任何多餘內容
這題有兩種解題思路:
1.數學邏輯推導
看懂後就是手算了:
2.動態規劃
看到這四個字首先是頭皮發麻,快乙個星期不寫了,當時學的那會被動規弄的死去或來的
定義狀態dp[ind][cnt]:ind層樓,cnt部手機時最壞運氣下最少的測試次數
狀態轉移方程:dp[ind][cnt] = min( 1 + dp[ind-1][cnt] , 1 + max( dp[k-1][cnt-1] , dp[ind-k][cnt] ) (1 < k < ind)
注意ind=1、2的時候,k是不存在的,這時候採用最大值 dp[ind-1][cnt]+1 即可,初始化 dp[0][cnt]=0
**:
#include usingnamespace
std;
int dp[1005][50
];int
main()
}printf(
"%d\n
",dp[n][m]);
return0;
}
以下內容幫助理解:
從k=2扔到k=ind-1的這個過程是為了檢查在這些樓層扔一部手機是否能根據歷史資料得到更優的結果; (我們已經計算過手機 cnt-1 部的所有情況和手機 cnt 部樓層數低於當前層數的所有資料) 最壞情況(也就是最大值)必然是確定ind-1層所用手機數+1; 先求得最大值後,再設定k在 2~ind-1 之間查詢是否存在可能的最小值; 嘗試在 2~ind-1 樓層扔手機會將產生兩種可能,一種是手機破碎,那麼還需要確定的就是手機少一部(cnt-1)確定 k-1 層數; 另一種自然是手機完好,那麼還需要用 cnt 部手機確定 ind-k 層數,這兩種情況所需的歷史值我們都已經計算過了! 這體現的是不斷通過選擇最優分塊的思路,一層一層確定~~
參考自:
藍橋杯摔手機測試次數
題目 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,...
動態規劃 藍橋杯測試次數
題目描述 x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的...
藍橋 測試次數
x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是 摔手機。各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出乙個耐摔指數來,之後才允許上市流通。x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的...