UVa 10934 DP Dropping water balloons
2015-08-31 21:20
295 查看
首先想一下特殊情况,如果只有一个气球,我们要确定高度只能从下往上一层一层地测试,因为如果气球一旦爆了,便无法测出气球的硬度。
如果气球有无数个,那么就可以用二分的方法来确定。
一般地,用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)
代码君
如果气球有无数个,那么就可以用二分的方法来确定。
一般地,用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)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef unsigned long long LL; const int maxn = 100 + 1; const int maxm = 64; LL a[maxn][maxm]; int n; LL h; int main() { for(int i = 1; i < maxn; i++) for(int j = 1; j < maxm; j++) a[i][j] = a[i-1][j-1] + 1 + a[i][j-1]; while(cin >> n >> h && n) { int i; for(i = 1; i < maxm; i++) if(a [i] >= h) break; if(i < maxm) printf("%d\n", i); else puts("More than 63 trials needed."); } return 0; }
代码君
相关文章推荐
- linux运维实战练习-正则表达式
- linux驱动之内存分配kmalloc
- xampp和testlink的安装
- 字符设备驱动copy_to_usr
- linux中文件描述符fd和文件指针flip的理解
- #pragma pack(push,1)与#pragma pack(pop)
- linux 查找文件中字符串
- 博客5:文件,目录以及用户的权限管理
- LINUX SHELL脚本攻略笔记[速查]
- 分布式文件存储fastdfs
- linux 命令
- Linux生产常用命令 --持续更新中
- Netty源码分析之EventLoop相关结构分析
- Hadoop系列之初始Hadoop
- java+Servlet+Tomcat 实现用户登录
- linux性能分析
- linux配置免密码ssh登录
- VMware下安装CentOS简要步骤
- Apache tomcat与nginx
- 49个权威的网上学习资源网站