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.\n");

22             return;

23     }

24     for (int i=0;i<64;i++){

25             if (f[k][i]>=n){

26                     printf("%d\n",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

 

你可能感兴趣的:(water)