首先想一下特殊情况,如果只有一个气球,我们要确定高度只能从下往上一层一层地测试,因为如果气球一旦爆了,便无法测出气球的硬度。
如果气球有无数个,那么就可以用二分的方法来确定。
一般地,用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 }
代码君
时间: 2024-10-08 10:14:24