【紫薯dp练习】从读题到放弃-uva 10934 Dropping water balloons

首先,题目的意思是让你去扔气球,砸小孩,非常玄幻。

【要点】

为什么2的时候是14呢?

关键在于我们虚晃一枪,先扔了50,如果没爆,那赚了,只需要测50就可以了(转移到了50的状态,下面的50都没用了,是不是非常眼熟?)

即使爆了,我们还可以继续扔,继续诓?

但是,50爆了,我们只能从1开始1 2 3 4 。。 保不好要扔49次,因此我们要找一个最好的地方去扔,避免浪费,还有效。

啊,想到是dp, 不要正面去想啊,找一个切入点。

【切入点】

除了“在任何情况下停下都是最佳的”,还有一个,就是结点的状态啊不,就是初始值一定要搞对。。。  初始值,。。。按照一样的模式往前发展,就很好。。。我倒霉觉得状态转移方程多重要。。。。

楼房数量非常大,所以我们可以用数组存一下,每次几个球,能达到的数量固定,n这么大, 只要线性比较一下就好了。

emmmmm,,,。。。 n这么大

 

然后。。 然后。。然后你随便找个地方k,

这里数组存储的只能代表楼层了

然后爆了就是在下面,没就是在中间

 

思维很重要。【严肃脸】

转个弯儿。。。 不然怎么也想不到啊

 

限定了最多63次,代码我没再写了 ,饭正就是对于一种情况n,就有63次尝试,最后匹配一下。。

真是想不出。。。

但是【严肃脸】

【其实一共就三个量,一个那么大,就把那条路毒死了】

【就像下一篇gym里二分那个题,有1e9,验证一个一个往下走的思路是正确的,但是随随便几个数据就能让你超时】

【这时候就想一下反向的存储来help】

 

参考网站 :链接

代码也是参考的那里的。。  我。。


/**=====================================================
 *   This is a solution for ACM/ICPC problem
 *
 *   @source      : uva-10934 Dropping water balloons
 *   @description : dp
 *   @author      : shuangde
 *   @blog        : blog.csdn.net/shuangde800
 *   @email       : zengshuangde@gmail.com
 *   Copyright (C) 2013/09/09 12:49 All rights reserved. 
 *======================================================*/
 
#include <bits/stdc++.h>
using namespace std;
 
typedef long long int64;
const int INF = 0x3f3f3f3f;
 
int64 f[110][65];
 
inline void init() {
    memset(f, 0, sizeof(f));
    for (int i = 1; i < 64; ++i) {
        for (int j = 1; j < 64; ++j) { 
            f[i][j] = f[i][j-1] + f[i-1][j-1] + 1;
        }
    }
}
int main(){
 
    init();
    int k;
    int64 n;
 
    while (~scanf("%d%lld", &k, &n) && k) {
 
        k = min(63, k);
        bool ok = false;
        for (int i = 0; i <= 63; ++i) {
            if (f[k][i] >= n) {
                printf("%d\n", i); 
                ok = true;
                break;
            } 
        }
        if (!ok) puts("More than 63 trials needed.");
    }
 
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值