动态规划(装满水的气球,uva 10934)

一开始 rte 是因为用了%I64d而没用%lld。在VJ上做的忘了是UVA上的题

后来 tle 是因为用了 while(scanf("%lld %lld",&k,&n),k+n) 而没用 while(scanf("%lld %lld",&k,&n)&&k)。题目描述与样例输入不符。还记得刘汝佳的一句话:程序要尽量写的鲁棒,因为哪怕是世界级的比赛,都会因为题目描述错了或者疏忽从而导致无法AC。这次有教训了。搞了好久。


至于如何理解解法。

首先要有一个思路上的转换,题目问的是k个气球n层楼,至少要多少次实验。然后可以将问题转化为,k个气球j次实验最多能干掉几层楼。不好说怎么理解,解决办法就是自己找几个例子,手动算一算就会感觉到其中的奥妙。

然后剩下的DP就简单了。主要是思路转换难。


代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll dp[101][64];

int main()
{
    for(ll i=1;i<=100;i++)
        for(ll j=1;j<=63;j++)
            dp[i][j]=dp[i-1][j-1]+1+dp[i][j-1];
    ll k,n;
    while(scanf("%lld %lld",&k,&n)&&k)
    {
        ll ans=lower_bound(dp[k]+1,dp[k]+64,n)-dp[k];
        if(ans==64) puts("More than 63 trials needed.");
        else printf("%lld\n",ans);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值