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集训队论文 从《鹰蛋》一题浅析对动态规划算法的优化
 

算法一: O(n^3)

dp[i][j] 表示用i个蛋在j层楼上确定E,最坏情况下的最少次数
枚举在第w层扔下1个蛋,要么碎,要么不碎
碎:用剩下的i-1个蛋在下面的w-1层里确定E
不碎:剩下的i个蛋在 w+1~n 层里确定E,这相当于在 下面的n-w 层确定E
所以dp[i][j]=min{ max(dp[i-1][w-1],dp[i][j-w]) } +1
事件复杂度为 O(n^2 * m),m认为与n同阶
 

算法二:O(n^2 * logn)

根据判定树的理论,长为n的有序线性表,最坏查找需要次数为logn [上取整]
所以当鹰蛋的个数超过 log(n+1) [上取整] 时,直接输出log(n+1) [上取整]
 

算法三:O(n*logn*logn)

比较显然的结论:dp[i][j]>=dp[i][j-1]
(严谨的证明去看论文)
dp[i][j]=min{ max(dp[i-1][w-1],dp[i][j-w]) } +1
dp[i-1][w-1] 随w的增大单调不减
dp[i][j-w] 随w的增大单调不增
对于每一个w,对应的这两条线谁在上面就取谁
所以最终更新 dp[i][j]的w是这两条线的交点
可以二分找这个w
 

算法四:O(n*logn)

dp[i][j]=min{ max(dp[i-1][w-1],dp[i][j-w]) } +1
对于任意的w,满足 dp[i][j]<= max(dp[i-1][w-1],dp[i][j-w])  +1
令w=1,那么dp[i][j]<= max(dp[i-1][0],dp[i][j-1])  +1
所以dp[i][j]<=dp[i][j-1]+1
所以 dp[i][j-1]<=dp[i][j]<=dp[i][j-1]+1
 
所以若存在一个w,能够使得dp[i][j]=dp[i][j-1],则dp[i][j]=dp[i][j-1]
若对于所有的w,都不能使得dp[i][j]=dp[i][j-1],则dp[i][j]=dp[i][j-1]+1
 
令p满足 dp[i][p]=dp[i][j-1]-1,dp[i][p+1]=dp[i][j-1]
那么dp[i][p]=dp[i][j-1]-1
dp[i][p+1]=dp[i][p+2]=……=dp[i][j-1]
 
计算dp[i][j]时,令j-w=p,则w=j-p
则 dp[i][j]=min{ max(dp[i-1][j-p-1],dp[i][p])  }
可以证明
当 dp[i-1][j-p-1]<=dp[i][p] 时,dp[i][j]=dp[i-1][j]
当 dp[i-1][j-p-1]>dp[i][p] 时,dp[i][j]=dp[i-1][j]+1
具体证明去看论文
 

算法五:

dp[i][j] 表示 用i个蛋,扔j次最坏情况下最大能确定的楼层数

扔一次碎了,那么剩下j-1次,剩下i-1个蛋

我们也希望用剩下的次数和剩下的蛋在下面能确定的楼层数最大,所以是dp[i-1][j-1]

扔一次没碎,那么剩下j-1次,剩下i个蛋

我们也希望用剩下的次数和剩下的蛋在上面能确定的楼层数最大,所以是dp[i][j-1]

加上扔蛋的这一次

所以 dp[i][j]=dp[i-1][j-1]+dp[i][j-1]+1

如果只有一个蛋,只能1层1层的试,dp[1][i]=i

如果只有一层,dp[i][1]=1

初始化和转移都跟 组合数C 很像

C爆炸式增长,所以这个也是爆炸式增长

论文里有证明

也就是说当n很大的时候,i和j很小

当n=2e9时,i和j只取到32就A了

#include<cstdio>

using namespace std;

typedef long long LL;

LL dp[][];

void DP()
{
for(int i=;i<=;++i) dp[i][]=,dp[][i]=i;
for(int i=;i<=;++i)
for(int j=;j<=;++j)
dp[i][j]=dp[i][j-]+dp[i-][j-]+;
} int main()
{
DP();
int T;
scanf("%d",&T);
int n,m,ans;
while(T--)
{
scanf("%d%d",&n,&m);
ans=-;
for(int i=;i<=;++i)
if(dp[m][i]>=n) { ans=i; break; }
if(ans==-) puts("Impossible");
else printf("%d\n",ans);
}
}
 

ZCMU 1894: Power Eggs的更多相关文章

  1. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  2. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  3. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验

    Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...

  4. Power BI官方视频(3) Power BI Desktop 8月份更新功能概述

    Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...

  5. 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库

    说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...

  6. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  7. 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???

    在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...

  8. 免费的精品: Productivity Power Tools 动画演示

    Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...

  9. 微软Power BI技术文章与资源目录

    下面是本博客原创的微软Power BI技术相关文章,对于部分转载文章和资源,会注明出处. 本博客将发布基于微软Power BI相关的基础入门文章,视频教程等资源,敬请关注. 个人建立的Power BI ...

随机推荐

  1. DevOps架构下如何进行微服务性能测试?

    一. 微服务架构下的性能测试挑战 微服务与DevOps 微服务是实现DevOps的重要架构 微服务3S原则 DevOps核心点 微服务架构下的业务特点 亿级用户的平台 单服务业务随时扩容 服务之间存在 ...

  2. 团队week9

    1. Bug bash ▪ How many bugs is found in your bug bash? Bug很多,就前端的用户管理部分发现的bug就有14个. 2. Write a blog ...

  3. 第五次Scrum meeting

    第五次Scrum meeting 会议内容: 连接方面:确定封装成json的文本格式,尽量在满足在线组和手机客户端两组的情况下,降低自身的难度 测试方面:进行新一轮测试,主要测试程序的稳定性和可靠性, ...

  4. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  5. 实训三(cocos2dx 3.x 打包apk)

    上一篇文章<实训二(cocos2dx 2.x 打包apk)>简单的讲述的利用cocos2dx 2.x引擎在windows平台上打包apk的方法与过程,本文将介绍3.x版本引擎,如何打包ap ...

  6. windows8/10+Ubuntu Kylin(优麒麟)双系统

    1.参考资料:http://www.jianshu.com/p/2eebd6ad284d 中第三种U盘启动方式安装完成 2.安装过程: (1)首先将一个盘空出来,做好其中数据的备份.启动win+X磁盘 ...

  7. Day Eight

    站立式会议 站立式会议内容总结 331 今天:学习树状自关联 hibernate配置,查询 详情:http://blog.csdn.net/u011644423/article/details/498 ...

  8. ElasticSearch 2 (18) - 深入搜索系列之控制相关度

    ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...

  9. week4

    History:Commercialization and Growth course Explosive Growth of the Internet and Web The Year of the ...

  10. 11th 回顾5个问题

    当初提出的5个问题: 1.书中说很多非常成功的软件都是赢在用户体验,后面的第12章也专门提到了用户体验,说软件开发时可以使用5W1H的方法来判断用户的体验,而需求分析需要获取用户需求,进行用户调研,那 ...