Chernobyl’ Eagle on a Roof(鹰蛋坚固度)

链接

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;
}

相关论文:《从《鹰蛋》一题浅析对动态规划算法的优化》

?

时间: 2024-10-08 09:46:44

Chernobyl’ Eagle on a Roof(鹰蛋坚固度)的相关文章

URAL1223——DFS—— Chernobyl’ Eagle on a Roof

Description Once upon a time an Eagle made a nest on the roof of a very large building. Time went by and some eggs appeared in the nest. There was a sunny day, and Niels Bohr was walking on the roof. He suddenly said: “Oops! All eggs surely have the

LeetCode887鸡蛋掉落——dp

题目 题目链接 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去,如果没有碎可以继续使用.你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破.每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N).你的目标是确切地知道 F 的值是多少.无论 F 的初始值如何,

noip模拟题题解集

最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 输入:输入文件只一行,两个正整数N,M( 1<N<50,2≤M≤5) 输出:输出文件只有一个正整数S,表示方案总数. 运用升格思想.设N个坑不会发生爆炸的方案数是f[N],那么我们假设N以前的坑的方案 都已知了,那么我们只需要考虑第N个坑如何放即可(顺

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

【转】国家集训队论文分类整理 作者:洪雁书

距离NOI时间越来越少了,选择性地看一些集训队论文是很有必要的. (在此给已经看过所有论文的神牛跪了= =) 所以,我在此整理了一下,供大家参考. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪

【资料】国家集训队论文集(1999~2014)

本文版权归ACShiryu和acvay所有,如转载请注明原作者. 国家集训队1999论文集 1.陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 2.来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 3.齐鑫:<搜索方法中的剪枝优化> 4.邵铮:<数学模型的建立.比较和应用> 5.石润婷:<隐蔽化.多维化.开放化--论当今信息学竞赛中数学建模的灵活性> 6.杨帆:<准确性.全面性.美观性--测试数据设计中的三要素

国家集训队论文

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

国家集训队论文整理分类

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

ZCMU 1894: Power Eggs

http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1894 题意: 有M个鹰蛋,N层楼,鹰蛋的硬度是E,也就是说在1~E层楼扔下去不会碎,E+1层楼扔下去会碎. 给定M,N,问最坏情况下至少几次能得到E的具体的值.(E可能为0) ①n<=100. ②n<=1000. ③n<=100000. ④n<=1000000. ⑤n<=1000000000. 推荐学习资料: 朱晨光IOI2004集训队论文 从<鹰蛋>一题浅析对