UVA10934 Dropping water balloons

Dropping water balloons

 https://odzkskevi.qnssl.com/0876833faf9646139e4e75ecade141db?v=1508497019

【题解】

太神辣。。。

dp[i][j]表示用i个气球,j次试验所测试的楼的最大高度

当我们已知dp[1~i][1~j]后,第一次试验,我们该把他放到什么高度放下去呢?

放下去后,最坏情况下会破碎,我们应该把它放到最坏情况(k层)往上一层(k+1层),还得

保证1~k层能算出来,破碎的球不能给我们提供任何有用的信息

所以应该从k = dp[i-1][j-1] + 1层地方放

因为最坏情况下,球会破碎,此时能确定的最大高度是dp[i - 1][j - 1]

考虑了最坏情况,但状态表示的是“最大高度”,要考虑最优

情况,即放下这个球之后,这个球没有破。此时我们还有i个球,

j-1次试验机会,还能实验出dp[i][j-1]层楼

于是dp[i][j] = dp[i - 1][j - 1] + 1 + dp[i][j - 1]

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <vector> 
 6 #define min(a, b) ((a) < (b) ? (a) : (b))
 7 #define max(a, b) ((a) > (b) ? (a) : (b))
 8 
 9 inline void swap(long long &a, long long &b)
10 {
11     long long tmp = a;a = b;b = tmp;
12 }
13 
14 inline void read(long long &x)
15 {
16     x = 0;char ch = getchar(), c = ch;
17     while(ch < '0' || ch > '9')c = ch, ch = getchar();
18     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
19 }
20 
21 const long long INF = 0x3f3f3f3f;
22 const long long MAXK = 100 + 10;
23 
24 long long dp[MAXK][MAXK], n, k;
25 
26 int main()
27 {
28     for(register long long i = 1;i <= 100;++ i)
29         for(register long long j = 1;j <= 63;++ j)
30             dp[i][j] = dp[i - 1][j - 1] + 1 + dp[i][j - 1];
31     int ans;
32     while(scanf("%lld%lld", &k, &n) != EOF && n && k)
33     {
34         ans = 0;
35         for(;ans <= 63;++ ans)
36             if(dp[k][ans] >= n)
37                 break;
38         if(ans > 63)printf("More than 63 trials needed.
");
39         else printf("%d
", ans);
40     }
41     return 0;
42 }
UVA10934
原文地址:https://www.cnblogs.com/huibixiaoxing/p/7723605.html