uva10934 Dropping water balloons

//好久没做题 一直没状态 然后刷了个水题玩玩

//寒假集训和校赛都做到了类似的题目 然而当时并不会 (其实现在也不会

题意:有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 */
View Code
原文地址:https://www.cnblogs.com/baby-mouse/p/4607491.html