题目描述

有一种玻璃杯质量确定但未知,需要检测。

题目解析

  • 2 个杯子的脆弱程度是一样的

  • 如果杯子从 N 楼扔下来没有碎,那么它从小于 N 楼扔下来,也不会碎

  • 如果杯子从 N 楼扔下来碎了,那么它从大于 N 楼扔下来,也一定会碎

  • 一个扔出去但没有碎的杯子,可以继续被用于试验

  • 碎了的杯子将无法再继续试验。

举个?:

那么问题来了:怎样才能最快速的找到这个楼层?

问题的解决有很多种方案,注意点就是找到的最佳方案是能在各种情况下都能快速地找到目标楼层

总结一下:我们的终极目的是要找出连续的两层楼 x 与 x + 1 ,在楼层 x 杯子没有摔碎,在楼层 x + 1 杯子碎了,问题的关键之处在于,测试之前,并不知道杯子会在哪一层摔碎,需要找到的是一种测试方案,这种测试方案,无论杯子会在哪层被摔碎,都至多只需要 m 次测试,在所有这些测试方案中, m 的值最小。

弄清题意后下面进行分析,事实上,学习过算法或者程序的人很容易想到这是一个搜索问题,那么完全可以使用二分法。

方案一:二分法

从 50 楼扔下,没碎的话,再扔 75 楼,再没碎我扔 88 楼,依次下去貌似很快就可以锁定楼层。

不过,很不巧,第一次从 50 层楼扔下去就碎了,这个时候就只能从 1 层开始慢慢的的一层一层地扔,如果杯子的质量是刚好在 49 层碎掉的话,那么最差的情况是需要扔 50 次。


方案二:分段查找区间法

核心点:先分区间的扔,再慢慢地一层一层地扔。

举个?:先从第 10 楼扔,再从第 20 楼扔,依次下去,如果到某一层碎掉,比如 60 层碎掉了,我再从 51 楼开始扔,这样比前面的二分法更快,因为即使又很不巧,杯子的质量比较好,在 99 楼才会刚好碎掉。这样的话,在这种最差的情况下,也只需要扔 19 次就能找到目标楼层。


方案三:基于数学方程的方法

事实上,这算是一道趣味问题,可以从数学的角度进行分析。

假设最少尝试次数为 x ,那么,第一个杯子必须要从第 x 层扔下,因为:如果碎了,前面还有 x - 1 层楼可以尝试,如果没碎,后面还有 x-1 次机会。

  • 如果没碎,第一个杯子,第二次就可以从 x +(x - 1)层进行尝试,这里加上 x - 1,是因为当此时,第一个杯子碎了,第二个杯子还有可以从 x + 1 到 ( x + (x - 1) - 1 ) 层进行尝试,有 x - 2 次机会。

  • 如果还没碎,那第一个杯子,第三次从 x + (x - 1) + (x - 2)层尝试。不管杯子碎或者没碎,都有 x - 3 次尝试机会,依次类推。

那么经过 x 次的尝试可以确定最高的楼层为 x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 。

那反过来,当最高楼层是100层,最少需要多少次呢?即 x(x+1)/2 >= 100, 得到 x >= 14 ,最少要尝试 14 次。

方案四:动态规划

先思考上面的 分段查找区间法 ,如果杯子的质量没那么好,在第 19 层就碎了,那么需要扔 11 次,这样比 99 楼刚好碎的情况要少很多次。

那么问题来了:能否无论杯子的质量如何,不管是很好还是很差,都可以快速地找到。

能!

上面的分析都是从杯子的角度出发的,这样想要得到最少的尝试次数,似乎比较难。我们可以换个角度,从每个高度的楼层来看:如果,某个楼层是可以安全落下的,那么最少需要多少次尝试呢?

事实上,这就是一个求最优解的问题了。

而我们编程解决问题的过程中,如果遇到最优问题的时候,往往可以先尝试一下动态规划的方法。

动态规划的一个出发点就是去 找到构成这个最优问题的最优子问题

我们可以将这样的问题简记为 W(n,k) ,其中 n 代表可用于测试的杯子数,k 代表被测试的楼层数。对于问题 W(2,10), 我们可以如此考虑

  • 将第 1 个杯子,在第 i 层扔下( i 可以为 1~k 的任意值),如果碎了,则我们需要用第 2 个杯子,解决从第 1 层到第 i-1 层楼的 子问题 W(1,i-1)

  • 如果这个杯子没碎,则我们需要用这两个杯子,解决从 i+1 层到第 100 层的子问题 W(2,100-i)。

解决这两个问题,可以分别得到一个尝试次数 p 与 q,我们取这两个次数中的较大者(假设是 p ),将 p 与第 1 次在 i 层执行测试的这一次相加,则 p+1 就是第一次将杯子扔在 i 层来解决 W(2,100) 所需的最少测试次数,将其表示为ti

对于这 100 层楼的问题,第一次,我们可以把杯子扔在 100 层中的任何一层,所以可以得到 100 中解决方案的测试次数 T{t1,t2,t3,……,t100} ,在这些结果中,我们选取最小的 ti,使得对于集合 T 中任意的值 tj(1 <= j <= 100,j != i),都有ti <= tj,则 ti 就是这个问题的答案。

用公式来描述就是:

W(n, k) = 1 + min{max(W(n -1, x -1), W(n, k - x))}, x in {2, 3, ……,k}

其中x是第一次的测试的楼层位置

其中W(1,k) = k(相当于 1 个杯子测试 k 层楼问题),W(0,k) = 0,W(n, 0) = 0

所以在计算 W(2,100) 之前,我们需先计算出所有 W(1,0) ,……, W(1,100) , W(2,0),……,W(2,99)这些的值。

使用递推的方法实现,代码如下:

 unsigned int DroppingCups(unsigned int cups, unsigned int floors){unsigned int i, j, k, t, max;unsigned int temp[cups + 1][floors + 1];for(i = 0; i &lt; floors + 1; ++i){temp[0][i] = 0;temp[1][i] = i;}for(i = 2; i &lt; cups + 1; ++i){temp[i][0] = 0;temp[i][1] = 1;}for(i = 2; i &lt; cups + 1; ++i){for(j = 2; j &lt; floors + 1; ++j){for(k = 1, max = UINT_MAX; k &lt; j; ++k){t = temp[i][j - k] &gt; temp[i - 1][k -1] ?  temp[i][j - k] : temp[i - 1][k -1];if(max &gt; t){max = t;}}temp[i][j] = max + 1;}}return temp[cups][floors];}

未完待续

这个问题实际上能延伸下去进行研究,比如进阶版:假设 f{n,m} 表示n层楼、m个杯子时找到最高楼层的最少尝试次数。还有上面代码时间复杂度和空间复杂度的也能进一步优化,这些内容放在下一篇进行分析。

推荐阅读

今日问题

把14亿中国人都拉到一个微信群

谈一谈你有什么想法?

说一个你知道的处理大数据的算法

打卡格式:打卡第n天,答:...

为什么打卡?戳下面就知道了!

21/天/养/一/个/好/习/惯

如果喜欢,给好看就完事了!谢谢鼓励

一道腾讯面试题:厉害了我的杯相关推荐

  1. python编辑距离正则匹配_详解一道腾讯面试题:编辑距离

    原标题:详解一道腾讯面试题:编辑距离 来自公众号:labuladong 预计阅读时间:8 分钟 前几天在网上看到一份鹅场的面试题,算法部分大半是动态规划,最后一题就是写一个计算编辑距离的函数,今天就专 ...

  2. 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器...

    何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算法特点 使用场景 假设遇到这样一个问题:一个网 ...

  3. put url带参数_一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?...

    来源:http://rrd.me/ekN8q 何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算 ...

  4. 一道腾讯面试题:英语单词拼写检查

    方法一:p神根据编辑距离(1和2)的算法 import re, collectionsdef words(text): return re.findall('[a-z]+', text.lower() ...

  5. 一道腾讯的专业面试题

    今天给大家分享的一道产品经理面试题是:"产品上线后最需要关注的指标有哪些?如何设立?为什么?",这道题是腾讯2013年的专业面试题,我将从面试题解析,回答策略,以及参考答案这三方面 ...

  6. 程序员求助:腾讯面试题,64匹马8个跑道,多少轮选出最快的四匹

    昨天,有网友私信我,说去阿里面试,彻底的被打击到了.问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题.无独有偶,今天笔 ...

  7. 一道指针压轴笔试题讲解 (进阶指针必看)

    今天我来给大家讲解一道指针压轴笔试题,同时也是进阶指针知识必会的一道题.相信大家在认真梳理清楚这道题后,对指针的知识了解定会更上一层楼 ~ 话不多说,上题目 : 请问程序输出结果是什么 ? 相信大家一 ...

  8. android获取指针空间大小_腾讯笔试题:浅谈计算机中cpu位数和指针

    来一个腾讯笔试题 在刷题的时候看到了腾讯笔试题的这个问题 long a = (long)(((int *) 0) + 4);printf("%ld ",a); 请问输出 a 的值是 ...

  9. 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了)

    title: 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了) tags: 面试常见题 腾讯面试题:char 和 varchar的最大长度是 ...

最新文章

  1. fftw-3.3.8库在linux下的的编译和配置
  2. python卸载_如何为Python程序制作Windows安装包?
  3. 【渝粤教育】国家开放大学2018年春季 0550-22T素描(一) 参考试题
  4. dell 服务器 非官方网站,教你如何在非官方渠道购买DELL电脑。
  5. matlab 读取tiff文件
  6. RJ45-网口变压器及网口变压器-cpu之间的一些抗干扰防雷设计
  7. Nature:进化新方式?线粒体DNA会插入我们的基因组
  8. 数学基础(5)凸优化、最优化理论基础
  9. 从头再学java系列之char和Character的区别及Character的源码分析
  10. Python —— 数据科学的手段 (第2版)配套代码
  11. Linux 电源管理 - Linux regulator framework
  12. NETDMIS5.0位置度评价案例1
  13. 详解:一次HTTP请求的全过程
  14. Message Bus - 消息总线
  15. 日本美女机器人 婀娜多姿会回眸一笑(图)
  16. 一些概念名称的来历札记
  17. wcdma码片速率_WCDMA中码片速率、符号速率、bit速率 WCDMA常用概念
  18. 一个神奇的下载按钮css实现
  19. html中富田文本,富田桥曾氏游浆豆腐制作技艺
  20. 滴滴柳青、58同城、美团创始人引领《财富》商界精英

热门文章

  1. 乘风破浪的PTM:两年来预训练模型的技术进展
  2. 一只端午节鸭蛋粽子的背后:AI 与农业
  3. iRobot的30年成长史
  4. 如何用Python实现超级玛丽的界面和状态机?
  5. 6大理由,告诉你为什么这个大会你不能错过! | 文末有福利
  6. 微软亚研院CV大佬代季峰跳槽商汤为哪般?
  7. AI换脸技术再创新高度,DeepMind发布的VQ-VAE二代算法有多厉害?
  8. 如何将知识图谱特征学习应用到推荐系统?
  9. 整合PyTorch 0.4和Caffe 2,PyTorch 1.0能挑战TensorFlow吗?
  10. Bullsh*t,System. currentTimeMillis大胆用起来,我说的!