1. 程式人生 > >標題:測試次數(100層樓扔雞蛋)

標題:測試次數(100層樓扔雞蛋)

標題:測試次數

x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。

各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,並且評定出一個耐摔指數來,之後才允許上市流通。

x星球有很多高聳入雲的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當於我們的2樓。

如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7。

特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0。

如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n

為了減少測試次數,從每個廠家抽樣3部手機參加測試。

某次測試的塔高為1000層,如果我們總是採用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢?

請填寫這個最多測試次數。

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

答案:19

題解

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

#define rep(i,a,b) for(int i=a;i<b;++i)
#define per(i,a,b) for(int i=b-1;i>=a;--i)

const int N=1010;

int dp[N][10];//dp[i][j]  表示j個球,能測出 i層內所有耐摔度 的 最小值

int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)==2) {

		for(int i=1;i<=n;i++)dp[i][1]=i;
		//for(int i=1;i<=m;i++)dp[0][i]=0;

        for(int j=2; j<=m; j++) {
            for(int i=1; i<=n; i++) {
                dp[i][j]=dp[i][j-1];
                for(int k=1; k<=i; k++) {
                    int t=max(1+dp[k-1][j-1],1+dp[i-k][j]);
                    dp[i][j]=min(dp[i][j],t);
                }
				//printf("i:%d j:%d dp:%d\n",i,j,dp[i][j]);
            }
        }

        printf("%d\n",dp[n][m]);
    }
    return 0;
}