//好久没做题 一直没状态 然后刷了个水题玩玩
//寒假集训和校赛都做到了类似的题目 然而当时并不会 (其实现在也不会
题意:有k个气球和一个n层高的楼,气球有硬度,在某曾会恰好摔碎,问至少多少次实验可以求出来恰好摔碎的楼层。
解:分两种情况讨论:当前楼层破,当前楼层不破,然后f[i][j]表示i个气球实验j次能测到的最高楼层,于是乎f[i][j]=f[i-1][j-1]+f[i][j-1]+1
/*
当前楼层破是f[i-1][j-1]+1,不破是f[i-1][j-1]+f[i][j-1]+1,最后求出来的范围是这两个的最大值。
破的话肯定小于求出来的范围,不破的话答案应该实在保证破能被确定出来的基础上继续向上找f[i][j-1]层
*/
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<stack> 11 #include<string> 12 13 using namespace std; 14 15 long long n; 16 int k; 17 long long f[101][101]; 18 19 void solve(){ 20 if (f[k][63]<n){ 21 printf("More than 63 trials needed. "); 22 return; 23 } 24 for (int i=0;i<64;i++){ 25 if (f[k][i]>=n){ 26 printf("%d ",i); 27 break; 28 } 29 } 30 } 31 32 int main(){ 33 memset(f,0,sizeof(f)); 34 for (int i=1;i<=100;i++){ 35 for (int j=1;j<64;j++){ 36 f[i][j]=f[i-1][j-1]+f[i][j-1]+1; 37 } 38 } 39 while (scanf("%d%lld",&k,&n)==2){ 40 if (k==0) return 0; 41 solve(); 42 } 43 return 0; 44 } 45 /* 46 2 100 47 10 786599 48 4 786599 49 60 1844674407370955161 50 63 9223372036854775807 51 0 0 52 */