Chernobyl’ Eagle on a Roof(鹰蛋坚固度)
链接
题意
引用论文题意:有一堆共 M 个鹰蛋,一位教授想研究这些鹰蛋的坚硬度 E。他是通过不断从一幢 N 层的楼上向下扔鹰蛋来确定 E 的。当鹰蛋从第 E 层楼及以下楼层落下时是不会碎的,但从第(E+1)层楼及以上楼层向下落时会摔碎。如果鹰蛋未摔碎,还可以继续使用;但如果鹰蛋全碎了却仍未确定 E,这显然是一个失败的实验。教授希望实验是成功的。
例如:若鹰蛋从第 1 层楼落下即摔碎,E=0;若鹰蛋从第 N 层楼落下仍未碎,E=N。这里假设所有的鹰蛋都具有相同的坚硬度。给定鹰蛋个数 M 与楼层数 N。
要求最坏情况下确定 E 所需要的最少次数。
做法
论文里用了5种方法,这里不如我们就介绍最优的那种。
定义dp(i,j),表示第i个蛋尝试j次在最坏情况下能确定E的最高楼层数,
每一个蛋一次只能确定一层楼,所以把dp(i,1)初始化为1,假设蛋没碎,每一个蛋最坏情况要扔i次才能确定层数,所以把dp(1,i)初始化为i。
然后状态转移是这样:假设在某一层楼扔下一只蛋,且碎了,则在下面的(j-1)次里,我们要用(i-1)个蛋在下面的楼层中确定 E。为了使 dp(i,j)达到最大,我们当然希望下面的楼层数达到最多,这便是一个子问题,答案为 dp(i-1,j-1);假设蛋没碎,则在后面(j-1)次里,我们要用 i 个蛋在上面的楼层中确定 E,这同样需要楼层数达到最多,便为 dp(i-1,j),然后不管怎样,我们都用了一次。即dp(i,j)=dp(i-1,j-1)+dp(i,j-1)+1。建立新的动态规划模型,从另一个角度重新审视问题,可以更快解决一些dp问题。
代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL dp[1010][1010];
int main() {
for(int i = 1; i <= 1000; i++) {
dp[1][i] = i;//一个蛋试i次最坏情况可在i层确定E
dp[i][1] = 1;//一个蛋一次只能确定一层楼
}
for(int i = 2; i <= 1000; i++) {
for(int j = 2; j <= 1000; j++) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1] + 1;
}
}
int n, m;//m 蛋,n 楼层
while(cin >> m >> n, n && m) {
LL ans = -1;
for(int i = 1; i <= 1000; i++) {
if(dp[m][i] >= n) {
ans = i;
break;
}
}
if(ans == -1)
puts("Impossible");
else
cout << ans << endl;
}
return 0;
}
Chernobyl’ Eagle on a Roof(鹰蛋坚固度)的更多相关文章
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
- 1223. Chernobyl’ Eagle on a Roof(dp)&&poj3783
经典DP n个鹰蛋 m层楼 刚开始是二分想法 不过当数小于二分的那个值 貌似没发判断 dp[i][j] = min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k]) 选择第k ...
- URAL 1223. Chernobyl’ Eagle on a Roof
题目链接 以前做过的一题,URAL数据强点,优化了一下. #include <iostream> #include <cstdio> #include <cstring& ...
- What number should I guess next ?——由《鹰蛋》一题引发的思考
What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...
- 高楼扔鸡蛋问题(鹰蛋问题) POJ-3783
这是一道经典的DP模板题. https://vjudge.net/problem/POJ-3783#author=Herlo 一开始也是不知道咋写,尝试找了很多博客,感觉有点领悟之后写下自己的理解. ...
- LeetCode887鸡蛋掉落——dp
题目 题目链接 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去,如果没有碎可以继续使用.你知道存在楼层 F , ...
- URAL DP第一发
列表: URAL 1225 Flags URAL 1009 K-based Numbers URAL 1119 Metro URAL 1146 Maximum Sum URAL 1203 Scient ...
- ural 1222. Chernobyl’ Eagles
1222. Chernobyl’ Eagles Time limit: 1.0 secondMemory limit: 64 MB A Chernobyl’ eagle has several hea ...
- noip模拟题题解集
最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...
随机推荐
- JSONEncoder
A flat implementation You could use something like this: from sqlalchemy.ext.declarative import Decl ...
- QT的creator中图示
不同的开发工具显示class和相关的用不同的图标表示.但大同小异.但对于QT的creator中图示确实不太好分.看图一目了然.
- 【2000*】【Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] B】Multihedgehog
[链接] 我是链接,点我呀:) [题意] [题解] 找到度数为1的点. 他们显然是叶子节点. 然后每个叶子节点. 往上进行bfs. 累计他们的父亲节点的儿子的个数. 如果都满足要求那么就继续往上走. ...
- APIO 2017 游记
//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意, ...
- HDU - 1310 - Digital Roots
先上题目: Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 楼控-西门子insight BBMD设置
BBMD设置的目的就是让两个不同网段的设备可以同时在一个系统中访问的操作. 比如你有两个bacnet的网络,但是一个是192.168.0.1-192.168.0.255的网段,另一个是10.0.0.1 ...
- 初探BurpSuite
BurpSuite这套渗透软件.或者已经能够说是渗透攻击平台了吧,玩的好.确实非常方便. 就像是玩英雄联盟的ADC,一開始玩VN.感觉非常难上手,玩多了肯定会爱上VN(啊,貌似提到了什么奇怪的东西). ...
- @RequiresPermissions 注解说明
@RequiresAuthentication验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时.@RequiresUser验证用户是否被记忆,user有 ...
- 【待解决】使用JUnit时报错java.lang
编写selenium自动化代码,代码逻辑应该都没有错,运行时老是报如下错误 java.lang.NoClassDefFoundError: org/json/JSONException 解决办法:导入 ...
- ios设计一部WindowsPhone手机
ios设计一部WindowsPhone手机 main.m #import <Foundation/Foundation.h> #import "WindowsPhone.h&qu ...