lintcode 丢鸡蛋
lintcode 丢鸡蛋
描述
楼有n层高,鸡蛋若从k层或以上扔,就会碎。从k层以下扔,就不会碎。
现在给两个鸡蛋,用最少的扔的次数找到k。返回最坏情况下次数。
样例
对于n=10, 一种找k的初级方法是从1、2…k层不断找。但最坏情况下要扔10次。
注意有两个鸡蛋可以使用,所以可以从4、7、9层扔。这样最坏就只需要4次(例如k=6时)。
给出 n = 10, 返回 4.
给出 n = 100, 返回14.
思路
先从最简单的方式丢起,一层一层扔,这样最坏的情况下需要的一定是n次,因为有两个鸡蛋,我们可以利用这一点将n层楼分段。
比如,对于12层楼高,可以从第四层开始扔,如果第四层碎了,只剩下一个鸡蛋,只能从1楼开始扔,这样就最多需要3+1 = 4次,如果第四层没有碎,就利用第一个鸡蛋继续分层,下面分层就有说法了,如果是从第8层开始扔,那么最坏是需要5次(k = 7),这样分不是我们想要的,因为如果没有碎,继续往上丢,下一次就是12层,当k=11时,需要6次才能得到这个k。
设楼高是n,第一种方式是等间隔扔,间隔是m(方便起见,假设m是n的一个因数),那么得到的试验次数就是n/m+m-1次,即最后一个间隔的倒数第二个,利用不等式,最小是2n\sqrt nn-1。第二种方式是每次间隔少1,设初始间隔为i(为了方便,同样满足i+i-1+i-2+…+1 = n),可以算出i = (-1 +1+8n\sqrt {1+8n}1+8n) / 2,可以判断出 i是比2n\sqrt nn-1还要小的,那么就通过计算得出了等间隔得出的结果在最坏情况下并不是最少的。
这样的话,第一次选择的间隔实际上就已经决定了最大的试验次数,也就是返回值。
下面问题来了,每次选择的间隔比上一次少,少几呢?刚才的计算方法是少1,如果是少2的情况,最差的情况就是第一个间隔的倒数第二个,最差情况下不会比少1好,所以不用再考虑间隔差更大的情况了。
综上所述,只需要决定初始间隔大小,就决定了返回的最少的最差试验次数。即i+i-1+i-2+i-3…+2+1>=n的最小i.
代码
class Solution {
public:
/*
* @param n: An integer
* @return: The sum of a and b
*/
int dropEggs(int n) {
// write your code here
double res = 0;
for(;;res++) {
double sum = (1 + res) * res / 2;
if (sum >= n)
return res;
}
}
};
lintcode 丢鸡蛋相关推荐
- 丢鸡蛋 [Python3]
丢鸡蛋 [Python3] '丢鸡蛋'是 LintCode(详见 LintCode介绍)所提供的一道 简单 级别的面试题,现在我对Python3的实现做以简单分析,如有不妥之处,欢迎指正. 题目描述 ...
- C语言丢鸡蛋100层,关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题
题目描述: 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋. 网上有人 ...
- 经典谷歌面试题-扔鸡蛋问题
假如有100层楼,总共有2个鸡蛋.需要多少次才能试探出临界点,比如,在第三层扔下去,不碎:在第四层扔下去,碎了,那第三层和第四层就是临界点. 如果之前没准备过的话,大概第一个想到的就是二分法. 1. ...
- dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题
dp 扔鸡蛋 Problem statement: You are given N floor and K eggs. You have to minimize the number of times ...
- LeetCode 鸡蛋掉落(最清晰的解法)
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 <= F <= ...
- Silverlight游戏设计(Game Design):(五)面向对象的思想塑造游戏对象
传说,面向对象的开发模式最初是因为程序员偷懒而不小心诞生的.发展至今,人们从最初的热忠于讨论某某语言是否足够面向对象到现在开始更广泛的关注面向对象的思想而不是具体内容.面向对象的思想其实并不深奥,它存 ...
- html 简单 在线编辑器 ie ff,一款垃圾中的极品HTML编辑器(兼容IE OR FF)
这东东实现了一些常用的功能,今天刚完成,大家多给点建议! 在FF下不完善,有些功能暂时还没实现! 这也是本人写的第一个编辑器(处女作哦),做得不好,千万别丢鸡蛋过来... 先闪人! /******** ...
- linux 信号_Linux的信号和线程
Linux的信号和线程-Tech Talk 让技术发出声音www.ttalk.im 什么是线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. ...
- Craking the Interview-1
1.6 90度旋转NxN矩阵 Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes ...
- Mobile开发(绘制背景图片)
Mobile开发环境,这里就不详细介绍了,无非就是根据自己的系统安装ActiveAsync和手机模拟器.我目前使用的是Mobile6.0的模拟器,目前有6.1的和6.5的,因为是兼容的,而且内核基本没 ...
最新文章
- Swift之深入解析“泛型”的底层原理
- Android DDMS的打开以及查看手机页面布局层次
- 去哪儿-15-keep-alive
- 【089】◀▶ Microsoft Office 技巧
- *第十五周*数据结构实践项目二【用哈希法组织关键字】
- Pytorch/Caffe可以先转换为ONNX,再转换为TensorRT
- J2EE快速入门之集合框架【01】
- window.dialogArguments
- 使用selenium登录QQ空间
- php怎样转换jpg,php pdf如何转jpg
- C++20 实现字符串类型的转换操作
- Unity中控制物体运动
- ts 手动实现 ts 中的map
- 基于图像识别的表格数据提取系统
- __attribute__((section(”XXXX“)))的编译属性---section
- 网站设计风格有很多种,看看哪种适合你?
- 直流电动机的平衡方程式
- 大包回转台液压滑环的应用
- 学习笔记(9):C#急速入门-格式化字符串输出
- openjudge开餐馆