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. NetBeans 插件开发简介

    希望 NetBeans 为您提供更多功能吗? 您希望倾心投入到 NetBeans 的开发中,并希望它能激发您开发另一个应用程序的热情.您希望聆听音乐.浏览网页.查看邮件.存储喜欢的 URL,以及维护日 ...

  2. Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

    Java容器类List.ArrayList.Vector及map.HashTable.HashMap的区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数 ...

  3. 自制一个H5图片拖拽、裁剪插件(原生JS)

    前言 如今的H5运营活动中,有很多都是让用户拍照或者上传图片,然后对照片加滤镜.加贴纸.评颜值之类的.尤其是一些拍照软件公司的运营活动几乎全部都是这样的. 博主也做过不少,为了省事就封装了一个简单的图 ...

  4. 利用可道云kodexplorer在树莓派raspbian上搭建私有云网盘

    可道云kodexplorer是一款开源私有云系统,类似于owncloud,Dropbox.SkyDrive,seafile等.将可道云kodexplorer搭建在树莓派上,从而在树莓派上存储.管理家庭 ...

  5. C++基础知识(3)

    C++内置的数据类型:基本类型.复合类型 基本类型:整型,浮点型,字符型 复合类型:数组,字符串,指针和结构 复合数据类型是在基本数据类型的基础上创建的 要知道系统中整数的最大长度,可以在程序中使用C ...

  6. 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...

  7. 在centOS中安装mongodb

    自己在一个CentOS6.6的系统中按照官网的说明,走了一遍的安装过程,记录一下. 看过个mongo的视频,上面介绍的安装是用源码安装,而官网上说需要gcc4.8.3的版本,还有scons的编译工具, ...

  8. 为什么HashMap不是线程安全的

    电面突然被问到这个问题,之前看到过,但是印象不深,导致自己没有答出来,现在总结一下. HashMap的内部存储结构 transient Node<K,V>[] table; static ...

  9. 英语学习APP

    第一部分 调研, 评测 下载并使用,描述最简单直观的个人第一次上手体验. 界面高大上,看起来很美观,是个不错的英语学习软件.我很喜欢. 2.按照<构建之法>13.1节描述的 bug 定义, ...

  10. 云平台项目--学习经验--jsrender前端渲染模板

    jsrender的好处:可以预先自定义一些固定的html标签,在需要显示数据的时候,可以直接传入真实的数据并显示在web页面中,避免了Js编写中的复杂过程:针对高性能和纯字符串渲染并优化,不需要依赖D ...