標題:測試次數(100層樓扔雞蛋)
阿新 • • 發佈:2019-02-14
標題:測試次數
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; }