UVA10934 Dropping water balloons
Posted 嘒彼小星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.\n"); 39 else printf("%d\n", ans); 40 } 41 return 0; 42 }
以上是关于UVA10934 Dropping water balloons的主要内容,如果未能解决你的问题,请参考以下文章
Dropping water balloons UVA - 10934(递推)
UVA10934 Dropping water balloons
uva 10934 Dropping water balloons
10934 - Dropping water balloons(DP)