题面

\(n\) 楼 \(m\) 个鸡蛋,从 \(k\) 楼及以上扔下去会碎,不能再测试 .

问至少需要扔几次确定 \(k\) .

\(n\le 10^{18}\),\(m\le 64\) .

题解

令 \(dp_{i,j}\) 表示 \(i\) 个鸡蛋丢 \(j\) 次能确定的最高楼层(其实是 OEIS A180975 / A131251) .

显然最后一个走第 \(k\) 步的时候,和上一步之间的空隙不能超过 \(dp_{i-1,j-k}+1\),不然中间无法判定 .

于是

\[\begin{aligned}dp_{i,j}&=\sum_{k=1}^{j}(dp_{i-1,j-k}+1)\\&=j+\sum_{k=0}^{j-1}dp_{i-1,k}\\&=dp_{i-1,j}+dp_{i-1,j-1}+1\end{aligned}
\]

即 \(dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}+1\) .

我们转成一个二项式系数的形式:

\[dp_{i,j}=\sum_{p=0}^{j-1}\sum_{q=0}^{i-1}\dbinom pq
\]
过程(artalter)

令 \(g_{i,j}=dp_{i+1,j}-dp_{i,j}\) .

\[\begin{aligned}g_{i,j}&=(1+dp_{i,j}+dp_{i,j-1})-(1+dp_{i-1,j}+dp_{i-1,j-1})\\&=dp_{i,j}+dp_{i,j-1}-dp_{i-1,j}-dp_{i-1,j-1}\\&=(dp_{i,j}-dp_{i-1,j})+(dp_{i,j-1}-dp_{i-1,j-1})\\&=g_{i-1,j}+g_{i-1,j-1}\end{aligned}
\]

妈呀这不是组合数吗?

于是就可以轻易建立 \(dp\) 到 \(g\) 的联系,从而推出式子了 .

随便推推

\[\begin{aligned}dp_{i,j}&=\sum_{p=0}^{j-1}\sum_{q=0}^{i-1}\dbinom pq\\&=\sum_{q=0}^{i-1}\sum_{p=0}^{j-1}\dbinom pq\\&=\sum_{q=0}^{i-1}\dbinom {j}{q+1}\end{aligned}
\]

然后随便线性做了 .

外面套一个二分就完了 .

时间复杂度 \(O(m\log n)\) .


细节:\(dp\) 增长很快,大于 \(n\) 直接丢掉,用 double 注意浮点误差

代码

using namespace std;
typedef long long ll;
typedef __int128 i128;
const int N = 111;
const double LIM = 1e18;
ll n, k;
inline bool check(ll x)
{
i128 now=1, ans=0;
for (int l=0; l<k; l++)
{
if (1.0*now*(x-l)/(l+1) > LIM) return true;
now = now*(x-l)/(l+1); ans += now;
if (ans >= n) return true;
} return ans >= n;
}
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%lld%lld", &n, &k);
ll l=0, r=n, ans=-1;
while (l <= r)
{
ll mid = (l + r) >> 1;
if (check(mid)){r = mid-1; ans = mid;}
else l = mid+1;
}
printf("%lld\n", ans);
}
return 0;
}

膜 社论(egg drop)的更多相关文章

  1. [Swift]LeetCode887. 鸡蛋掉落 | Super Egg Drop

    You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is ident ...

  2. 887. Super Egg Drop

    You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is ident ...

  3. [LeetCode] 887. Super Egg Drop 超级鸡蛋掉落

    You are given K eggs, and you have access to a building with N floors from 1 to N.  Each egg is iden ...

  4. 【LeetCode】887. Super Egg Drop 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 参考资料 日期 题目地址:https://leetc ...

  5. Coursera Algorithms week1 算法分析 练习测验: Egg drop 扔鸡蛋问题

    题目原文: Suppose that you have an n-story building (with floors 1 through n) and plenty of eggs. An egg ...

  6. Leetcode 887 Super Egg Drop(扔鸡蛋) DP

    这是经典的扔鸡蛋的题目. 同事说以前在uva上见过,不过是扔气球.题意如下: 题意: 你有K个鸡蛋,在一栋N层高的建筑上,被要求测试鸡蛋最少在哪一层正好被摔坏. 你只能用没摔坏的鸡蛋测试.如果一个鸡蛋 ...

  7. LeetCode 887. Super Egg Drop

    题目链接:https://leetcode.com/problems/super-egg-drop/ 题意:给你K个鸡蛋以及一栋N层楼的建筑,已知存在某一个楼层F(0<=F<=N),在不高 ...

  8. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  9. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

随机推荐

  1. 136. Single Number - LeetCode

    Question 136. Single Number Solution 思路:构造一个map,遍历数组记录每个数出现的次数,再遍历map,取出出现次数为1的num public int single ...

  2. 200 行代码实现基于 Paxos 的 KV 存储

    前言 写完[paxos 的直观解释]之后,网友都说疗效甚好,但是也会对这篇教程中一些环节提出疑问(有疑问说明真的看懂了 ),例如怎么把只能确定一个值的 paxos 应用到实际场景中. 既然 Talk ...

  3. Three.js 打造缤纷夏日3D梦中情岛 🌊

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 深居内陆的人们,大概每个人都有过大海之梦吧.夏日傍晚在沙滩漫步奔跑:或是在 ...

  4. 清明欢乐赛(USACO选题)

    总传送门 T1. [USACO19JAN] Redistricting P luogu P5202 思路: 这种每次选出段长有个上限\(k\)的常常是和单调队列有关. 这里是单调队列优化dp 不过一开 ...

  5. 为什么Dapr是比SpringCloud和Istio更优雅的微服务框架?

    Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到正式发布 V1.0 版本的不到一年的时间内,github star 数达到了 1.2万(现在已经超过1.7万星),超过同期的 kube ...

  6. 论文阅读 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning

    6 dyngraph2vec: Capturing Network Dynamics using Dynamic Graph Representation Learning207 link:https ...

  7. Markdown的使用指南

    # Markdown学习 ------ 以下符号均是英文输入法下的 ## 1.标题 几级标题就写 几个#号 加 空格 加 标题内容 就可以 例如: ###加空格加三级标题效果如下 ### 三级标题 # ...

  8. ShardingSphere 异构迁移最佳实践:将3.5亿量级的顾客系统 RTO 减少60倍

    Apache ShardingSphere 助力当当 3.5 亿用户量级顾客系统重构,由 PHP+SQL Server 技术栈无缝转型为 Java+ShardingSphere+MySQL,性能.可用 ...

  9. Javaer 面试必背系列!超高频八股之三色标记法

    可达性分析可以分成两个阶段 根节点枚举 从根节点开始遍历对象图 前文提到过,在可达性分析中,第一阶段 "根节点枚举" 是必须 STW 的,不然如果分析过程中用户进程还在运行,就可能 ...

  10. 左右手切换工具xmouse v1.2版本发布

    Xmouse 方便的切换鼠标左右键,因为功能非常简单,所以支持.net framework 2.0及以上 windows环境就可以了,目前已测试win7.win10可用. 关于为什么做这么个东西,那是 ...