UVa 10934 DP Dropping water balloons

首先想一下特殊情况,如果只有一个气球,我们要确定高度只能从下往上一层一层地测试,因为如果气球一旦爆了,便无法测出气球的硬度。

如果气球有无数个,那么就可以用二分的方法来确定。

一般地,用d(i, j)表示用i个气球实验j次所能确定的楼层的最大高度。

我们假设第一个气球从第k层扔下,

  • 如果气球爆了,那么剩下的i-1个气球实验j-1次,要能在下面的k-1层确定气球的硬度。所以这个k最大取d(i-1, j-1)+1
  • 气球没爆,那么第1~k层就完全不用管了,i个气球剩下的j-1次测试就直接往上测试就行,最多能测试d(i, j-1)层

所以d(i, j) = d(i-1, j-1) + 1 + d(i, j-1)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 typedef unsigned long long LL;
 8 
 9 const int maxn = 100 + 1;
10 const int maxm = 64;
11 
12 LL a[maxn][maxm];
13 
14 int n;
15 LL h;
16 
17 int main()
18 {
19     for(int i = 1; i < maxn; i++)
20         for(int j = 1; j < maxm; j++)
21             a[i][j] = a[i-1][j-1] + 1 + a[i][j-1];
22 
23     while(cin >> n >> h && n)
24     {
25         int i;
26         for(i = 1; i < maxm; i++) if(a[n][i] >= h) break;
27         if(i < maxm) printf("%d\n", i);
28         else puts("More than 63 trials needed.");
29     }
30 
31     return 0;
32 }
代码君

 

posted @ 2015-08-31 21:20  AOQNRMGYXLMV  阅读(454)  评论(0编辑  收藏  举报