Uva-10934 Dropping water balloons(dp)

185 篇文章 0 订阅
116 篇文章 0 订阅

题意:现在你需要确定一种气球的硬度;每次你要拿着一个气球爬到f层,然后将它摔到地面,如果气球破了说明它的硬度不超过f,如果没破说明其硬度至少为f,每次实验后气球不会损坏,现在有n层楼,你有k个这种气球,问至少实验多少次能测出这种气球的硬度.


分析:如果没有气球个数限制很容易想到直接二分那样去做,但是现在气球会有损耗,问题可以转化为有i个气球丢j次可以测量的最大楼层数(迷之思路啊),然后我们考虑第一次试验的楼层数x,如果这一次试验如果破了那么我们可以用剩下的i-1个球和j-1次试验去测量剩下的x-1层,如果没破那么我们可以用i个球j-1次试验去测试再往上的f[i][j-1]层楼。

那么有f[i][j] = f[i-1][j-1] + 1 + f[i][j-1].



//感觉紫书上的这种解释还是很不直观不好理解,我自己又yy了一种理解方式,这个问题的本质可以转化为让我构造一棵“决策树",每次从根节点往左走就带表根节点这次实验中气球破了,往右走代表气球没破,那么问题就转化为限制了往左走的深度(气球个数)然后问要想让"决策树"覆盖到n整棵树的深度(实验次数)至少为多少,再转换一下就是给定这棵树的往左走最大深度和整棵树的最大深度问这棵树的覆盖范围,这样f[i][j] = f[i-1][j-1] + 1 + f[i][j-1]这个式子就比较容易理解了.//

#include <bits/stdc++.h>
#define mask 100
using namespace std;
long long n,k,f[105][64];
int main()
{
    for(int i = 1;i <= 100;i++)
     for(int j = 1;j <= 63;j++)
      f[i][j] = f[i-1][j-1] + 1 + f[i][j-1];
    cin.sync_with_stdio(false);
    while(cin>>k>>n && k && n)
    {
        bool flag = false;
        for(int i = 1;i <= 63;i++)
         if(f[k][i] >= n)
         {
             flag = true;
             cout<<i<<endl;
             break;
         }
         if(!flag) cout<<"More than 63 trials needed."<<endl;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值