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. 【ORACLE】oracle数据库用户密码复杂度配置

    -- 设置密码复杂度 SQL> @ /u01/app/oracle/product/11.2.0/db_1/rdbms/admin/utlpwdmg.sql -- 测试 SQL> alte ...

  2. 【原】python3.7 无法pip安装提示ssl错误解决方案

    问题 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not av ...

  3. GitHub 新手教程 六,Git GUI 新手教程(3),从GitHub远端同步代码库

    从GitHub把代码库下载到本地: 1,打开 GitGUI,单击我们之前克隆好的本地库: 2,按图片所示点击,同步远端代码: 3,出现如下提示后,点击“Close”: 4,上面只是把代码下载下来,还没 ...

  4. ats显示代理缓存

    如果要将ats用作显示代理缓存,则必须配置客户端软件(即浏览器)以将请求直接发送到ats. 如果没有将ats配置为使用透明度选项(通过交换机或路由器在路由到源服务器的情况下拦截客户端请求并重新路由到a ...

  5. R语言做相关性分析

    衡量随机变量相关性的方法主要有三种:pearson相关系数,spearman相关系数,kendall相关系数: 1.       pearson相关系数,亦即皮尔逊相关系数 pearson相关系数用来 ...

  6. C#程序解读

    阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...

  7. Software-Defined Networking:A Comprehensive Survey--Day1

    Software-Defined Networking:A Comprehensive Survey 摘要: 传统网络复杂且难以管理,根据预定义策咯也难以对网络进行配置,也难以重新配置. 软件定义网络 ...

  8. springmvc下载文件

    Controller内代码: @RequestMapping(value = "/upload") public ResponseEntity<byte[]> uplo ...

  9. django学习--1

    1 安装 安装anacanda后 conda install django 2 新建项目 django-admin.py startproject HelloWorld 创建完成后我们可以查看下项目的 ...

  10. [转帖]Windows10七大版本区别在哪?

    Windows10七大版本区别在哪? http://os.51cto.com/art/201804/570132.htm 一.Windows10家庭版 对于绝大多数用户来说,最后可能获得的应该就是Wi ...