Dropping water balloons UVA - 10934(递推)

Dropping water balloons

 UVA - 10934

题意:

可以说是很懵比了。。。

上一个题有相似之处,就是我们需要判断的结果是一个未知量。如本题气球的硬度,可能为1,2,3,------,n,n+1。

最坏情况需要测到n楼才知道结果。题目要求确定气球硬度,我们要考虑所有情况。【即我们要求的是最少测几次才可以测到n楼。】

用d[i][j]表示i个气球j次试验最多测到d[i][j]楼(即运气足够好的情况下可以测到几层楼)【这也是题目要求的,最少几次!!】

(上面这两条红字放一起有点难以理解)


我们首先要求的是第一次最好在哪一层楼进行测试

先设第一次为k楼最好(以下八行都是在这个假设下进行的,记为假设一吧)

如果第一次气球就破,则说明i-1个气球j-1次试验测(即d[i-1][j-1])需要测到k-1层楼才可以,即d[i-1][j-1]==k-1。证明如下:

反证法:

假设d[i-1][j-1]=x<k-1,则x楼到k楼之间是断层,说明第一次测试的k楼没有意义,k不是最好,与假设一矛盾,故d[i-1][j-1]>=k-1

假设d[i-1][j-1]=x>k-1,即d[i-1][j-1]>=k,说明i-1个气球j-1次就可以测到k+层楼了,第一次测试的k层楼没有意义,k不是最好,与假设一矛盾,故d[i-1][j-1]<=k-1

综上,d[i-1][j-1]==k-1。

即i个气球j次试验第一次最好在k=d[i-1][j-1]+1楼进行测试

同时这也是第一次气球就破的情况下最多可以测到的楼层数d[i][j]=k=d[i-1][j-1]+1。


如果第一次气球不破,那么我们还剩下i个气球j-1次试验,最多可以再测d[i][j-1]层楼(要仔细考虑,和高度无关),再加上之前的k楼

即第一次气球不破的情况下最多可以测到的楼层数d[i][j]=d[i][j-1]+k=d[i][j-1]+d[i-1][j-1]+1。

所以,综上分析,i个气球j次试验最多可以测到d[i][j]=d[i][j-1]+k=d[i][j-1]+d[i-1][j-1]+1。


现在回到题目,【即我们要求的是最少测几次才可以测到n楼。】

根据递推公式预处理d[i][j]表。

气球数目为k,楼层为n,只需枚举次数j,当d[k][j]>=n时j即为所求解。

 

 1 #include <cstdio>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 #define LL long long
 5 LL f[110][65];
 6 int k;
 7 LL n;
 8 
 9 int main()
10 {
11     memset(f,0,sizeof(f));
12     for(int i=1;i<=100;i++)
13         for(int j=1;j<64;j++)
14             f[i][j]=f[i-1][j-1]+1+f[i][j-1];
15     while(scanf("%d%lld",&k,&n)&&k)
16     {
17         if(f[k][63]<n)
18         {
19              puts("More than 63 trials needed.");
20              continue;
21         }
22         for(int i=1;i<=63;i++) if(f[k][i]>=n)
23         {
24             printf("%d\n",i);
25             break;
26         }
27     }
28     return 0;
29 }
View Code

 

posted @ 2017-08-24 11:33  yijiull  阅读(111)  评论(0编辑  收藏  举报