1. 程式人生 > >第九屆藍橋杯省賽C++B組第四題

第九屆藍橋杯省賽C++B組第四題

測試次數

x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。 各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出一個耐摔指數來,之後才允許上市流通。 x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當於我們的2樓。 如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7。 特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0。 如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n 為了減少測試次數,從每個廠家抽樣3部手機參加測試。 某次測試的塔高為1000層,如果我們總是採用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢? 請填寫這個最多測試次數。

注意:需要填寫的是一個整數,不要填寫任何多餘內容。

這個題是想了好久好久才算是弄明白的,今天特意整理一下,用到了動態規劃的思想,參考了一下網上的答案,但是好多都是隻有程式碼,很難講清楚,如果有不明白的可以在底下評論,交流交流。

#include <iostream>
#include <cmath>

using namespace std;

int dp[50][1005];
int main()
{
    int phone,floor;
    cin >> floor >> phone;
    for(int i=1;i<=phone;
i++) { for(int j=1;j<=floor;j++) dp[i][j]=j; ///第i部手機在第j層摔壞的最壞次數為j次,特別注意是每一部手機 } for(int i=2;i<=phone;i++) { for(int j=1;j<=floor;j++) { for(int k=1;k<j;k++) ///從第k層摔下 dp[i][j]=min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1); } } cout << dp[phone][floor]; return
0; }