经典DP
n个鹰蛋 m层楼 刚开始是二分想法 不过当数小于二分的那个值 貌似没发判断
dp[i][j] = min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k]) 选择第k层扔 若碎了 就用剩下i-1个鹰蛋来测k-1层 若没碎 就用i个鹰蛋来测上面剩下的j-k层
这样是三重循环 1000^3势必TLE 不过以二分的思想来算 1000层最多只需要10个鹰蛋就可以测出来了 所以当n大于10的时候按10来算就OK了
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 #define INF 1e9 8 int dp[12][1010]; 9 void init() 10 { 11 int i,j,k; 12 for(i = 1; i <= 1000 ; i++) 13 { 14 dp[1][i] = i; 15 //dp[0][i] = 0; 16 } 17 for(i = 1; i <= 10 ; i++) 18 { 19 dp[i][0] = 0; 20 dp[i][1] = 1; 21 } 22 for(i = 2; i <= 10 ; i++) 23 { 24 for(j = 1; j <= 1000 ; j++) 25 { 26 dp[i][j] = INF; 27 for(k = 1; k <= j ; k++) 28 dp[i][j] = min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1); 29 } 30 } 31 } 32 int main() 33 { 34 int n,m,i,j; 35 init(); 36 while(scanf("%d%d",&n,&m)!=EOF) 37 { 38 if(!n&&!m) 39 break; 40 if(n>10) 41 n = 10; 42 printf("%d ",dp[n][m]); 43 } 44 return 0; 45 }