UVa 10934 DP Dropping water balloons

首先想一下特殊情况,如果只有一个气球,我们要确定高度只能从下往上一层一层地测试,因为如果气球一旦爆了,便无法测出气球的硬度。

如果气球有无数个,那么就可以用二分的方法来确定。

一般地,用d(i, j)表示用i个气球实验j次所能确定的楼层的最大高度。

我们假设第一个气球从第k层扔下,

  • 如果气球爆了,那么剩下的i-1个气球实验j-1次,要能在下面的k-1层确定气球的硬度。所以这个k最大取d(i-1, j-1)+1
  • 气球没爆,那么第1~k层就完全不用管了,i个气球剩下的j-1次测试就直接往上测试就行,最多能测试d(i, j-1)层

所以d(i, j) = d(i-1, j-1) + 1 + d(i, j-1)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 typedef unsigned long long LL;
 8
 9 const int maxn = 100 + 1;
10 const int maxm = 64;
11
12 LL a[maxn][maxm];
13
14 int n;
15 LL h;
16
17 int main()
18 {
19     for(int i = 1; i < maxn; i++)
20         for(int j = 1; j < maxm; j++)
21             a[i][j] = a[i-1][j-1] + 1 + a[i][j-1];
22
23     while(cin >> n >> h && n)
24     {
25         int i;
26         for(i = 1; i < maxm; i++) if(a[n][i] >= h) break;
27         if(i < maxm) printf("%d\n", i);
28         else puts("More than 63 trials needed.");
29     }
30
31     return 0;
32 }

代码君

时间: 2024-10-08 10:14:24

UVa 10934 DP Dropping water balloons的相关文章

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

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

uva 10934 Dropping water balloons(转载)

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

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.球没有破.那么

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次释放机会时最多可以测到第几层 状态转移:

uva10934 Dropping water balloons

//好久没做题 一直没状态 然后刷了个水题玩玩 //寒假集训和校赛都做到了类似的题目 然而当时并不会 (其实现在也不会 题意:有k个气球和一个n层高的楼,气球有硬度,在某曾会恰好摔碎,问至少多少次实验可以求出来恰好摔碎的楼层. 解:分两种情况讨论:当前楼层破,当前楼层不破,然后f[i][j]表示i个气球实验j次能测到的最高楼层,于是乎f[i][j]=j[i-1][j-1]+f[i][j-1]+1 1 #include<cstdio> 2 #include<iostream> 3 #

uva 1401 dp+Trie

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=4147 题意:给定一个字符串,以及若干单词,求有几种方式能用单词组成字符串 我先是dp方程推得有问题不知怎么修改搞得卡了很久,然后就是数组开得太小一直RE trie数组大小=单词个数*单词长度  dp[i]为以str[i]开头的后缀的ans,dp[i]=segma(

uva 10934(dp)

题意:k个水球,现在在一个n层建筑物上,水球可能在某一层层以上扔下去会破掉,现在求一个最少的次数使得用这k个水球能确定出哪一层. 思路:假设有i个小球,还可以实验j次时,第一个小球从x处扔下去,如果破了,那么可以确定答案肯定在x之下找,剩下i-1个小球和j-1次实验,可以在x之下确定出最高层数,那么x-1就是这最高层数(试想如果x-1 > 最高层数,那么中间可能有一些层数就无法确定了)所以x = f[i - 1][j - 1] + 1; 然后在考虑,如果这个小球在x位置没破,那么就往上找,这时候

uva 1291 dp

UVA 1291 - Dance Dance Revolution 有一个跳舞机.原点为0,有四个方向,上左下右,分别标成(1234),初始玩家两只脚站在 0 位置,跳舞机会给出一串数字,玩家要按照顺序踩下四个方向的数字.移动脚会消耗玩家的能量,从0位置移动到四个方向消耗2点能量,从一个方向移动到另一个相邻的方向消耗3点能量,从一个方向移动到相反方向消耗4点能量,原点踩一下消耗1点能量.问你踩出这串数子最少要花多少能量. 根据能量消耗关系,我们可以发现当前两只脚踩的方向才是重点.然而要记录两只脚