10934 - Dropping water balloons(DP)

这道题的思路非常难想。 问你须要的最少实验次数,这是非常难求解的。并且我们知道的条件仅仅有三个。k、n、实验次数 。

所以我们最好还是改变思路,转而求最高所能确定的楼层数 。  那么用d[i][j]表示用i个球,实验j次所能确定的最高楼层数 。

那么我们如果第j次实验是在k楼,有两种可能: 1、球破了。那么状态怎样转移? 用了一个球,用了一次实验机会。所以最优情况一定是从d[i-1][j-1]转移过来的,所以这一次实验向下所能确定的最大楼层数为d[i-1][j-1] + 1 ;2、球没有破。那么代价仅仅是用掉了一次实验机会,所以向上最高仍能确定d[i][j-1]层 。

这样d[i][j]就成功的将状态转移到子状态的最优解上了 。  那么这将也是最优解,由于他们具有相似的结构 。

代码例如以下:

#include<bits/stdc++.h>
using namespace std;
unsigned long long k,n,d[105][65];
int main() {
    while(cin>>k>>n&&k) {
        memset(d,0,sizeof(d));
        for(int i=1;i<=k;i++) {
            for(int j=1;j<=64;j++) {
                d[i][j] = d[i-1][j-1] + 1 + d[i][j-1];
            }
        }
        int ans = 0;
        for(int i=64;i>=1;i--) {//搜索最少实验次数。假设64满足条件。则超过了实验次数限制
            if(d[k][i] < n) { ans = i+1; break; }
            if(d[k][i] == n) { ans = i; break; }
        }
        if(ans<=63) printf("%d\n",ans);
        else printf("More than 63 trials needed.\n");
    }
    return 0;
}
时间: 2024-10-01 23:07:14

10934 - Dropping water balloons(DP)的相关文章

UVa 10934 - Dropping water balloons(DP)

给出n个相同的气球,k层楼,问最少几次试验可以知道气球最高从多少层扔下不会爆. 用d[i][j]表示用i个球,实验j次所能确定的最高楼层数,对于每一次试验分爆和不爆两种情况讨论: 1.爆了,转移到d[i?1][j?1]+1,用掉了1个球和一次试验机会. 2.没爆,将当前测试层数的上一层当做第1层继续进行试验,转移到d[i][j?1]. 得出转移方程d[i][j]=d[i?1][j?1]+1+d[i][j?1]. 好久之前做的题了,具体思路见紫书. #include<cstdio> #inclu

Dropping water balloons (入门dp)

2017-08-12 18:36:24 writer:pprp 最近刚刚接触动态规划,感觉状态的查找和转移自己很难想到,都是面向题解编程,但是一开始都是这样了,只有相信我可以独立自己解决动态规划这类问题: 题意:给你N个水球,M个楼 水球可能在某个楼层上释放就会破裂,问最少在几次内就可以得到水球破裂的临界楼层 如果次数大于63那就输出:More than 63 trials needed. 状态分析: dp[i][j] : 表示在目前有i个水球,还有j次释放机会时最多可以测到第几层 状态转移:

uva 10934 Dropping water balloons(转载)

本文转载自http://blog.csdn.net/shuangde800/article/details/11273123 题意 你有k个一模一样的水球,在一个n层楼的建筑物上进行测试,你想知道水球最低从几层楼往下丢可以让水球破掉.由于你很懒,所以你想要丢最少次水球来测出水球刚好破掉的最低楼层.(在最糟情况下,水球在顶楼也不会破)你可以在某一层楼丢下水球来测试,如果水球没破,你可以再捡起来继续用. Input 输入的每一行包含多组测试,每组测试为一行.每组测试包含两个整数 k 和 n, 1 <

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]楼(即运气足够好的情况下可以测到几层楼)[这也是题目要求的,最少几次!!] (上面这两条红字放一

hdu 4974 A simple water problem(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4974 Problem Description Dragon is watching competitions on TV. Every competition is held between two competitors, and surely Dragon's favorite. After each competition he will give a score of either 0 or

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

Sicily 1146:Lenny&#39;s Lucky Lotto(dp)

题意:给出N,M,问有多少个长度为N的整数序列,满足所有数都在[1,M]内,并且每一个数至少是前一个数的两倍.例如给出N=4, M=10, 则有4个长度为4的整数序列满足条件: [1, 2, 4, 8], [1, 2, 4, 9], [1, 2, 4, 10], [1, 2, 5, 10] 分析:可用动态规划解题,假设dp[i][j],代表满足以整数i为尾数,长度为j的序列的个数(其中每一个数至少是前一个数的两倍).那么对于整数i,dp[i][j] 等于所有dp[k][j-1]的和,其中k满足: