今天在codewar中挑战kata的时候遇到了这么一道题

 这道题是一道经典的双蛋问题(或者又双叒叕蛋问题),不过又有所区别,传统的双蛋问题是给定n个蛋(假定n个蛋完全一致),从楼层为T的摩天大楼中扔下,请问在最坏的情况下经过多少次能找到极限楼层(即从该楼层扔下蛋刚好不碎。)

而今天遇到的问题是给定n个蛋和有限的测试次数m次,为保证一定能找出极限楼层,设计出算法求解出极限楼层必须在多少层(设为T)以内。

首先是m或n等于零的情况,由于没有蛋和实验次数,所以一定不能测出。假定m等于1,那么T必须等于一。

我曾在高三的时候看过李永乐老师讲解双蛋问题(李永乐:双蛋问题),让我们来分析一下n=2时的情况。根据题目给的测试样本,当n=2,m=14时,T应当为105

这个数字是怎么来的呢?首先,我们第一次从14层扔下,如果蛋碎了,则还剩13次机会从1-13层中一层一层地测出极限楼层。如果没有碎,因为如果我们再扔一次,如果碎了,我们只有12次机会来测极限楼层,因此我们第二次得从14+13=27层扔下。按照这个思路,我们能接受的最大楼层为14+13+12+.......+3+2+1=105层。所以当n=2时,T等于一到m的累加。

当n=2时还比较好理解,更困难的是当n>2时应当怎么扔。我们来假定一下n=3,m=4的情况,此时我们可以这么理解,(3,4)是在(2,3)的基础上再扔了一次,而(2,3)能从6层中找出极限楼层,因此这多出来的一次我们应该从7层扔出,如果碎了正好还能测出极限楼层,如果没碎就往上继续查找,

即把(3,4)分解为(2,3)+(3,3)+1

上式中的(3,3)是第一个鸡蛋没碎进行后续的极限寻找,1是扔下鸡蛋的那一层.

以上的过程就是不断分解,分解到1=2或m=1为止。这很容易让我们想到递归函数,于是便有了以下代码

def solve(n, m):if n == 0 :return 0if m == 1:return 1if n == 1:return mreturn solve(n, m-1)+solve(n-1,m-1)+1

但是,这个代码没有通过测试,当n=7,m=50时,它运行了2.96s,当m=60时,它更是运行了9.28s.

分析原因是因为分解次数过多,以上说了当n=2时,T等于一到n的累加和,所以进行了一小点改动

def solve(n, m):if n == 0 :return 0if m == 1:return 1if n == 2:return sum(range(m))return solve(n, m-1)+solve(n-1,m-1)+1

在m=50时用了0.70s,在m=60时用了1.90s,相比之下速度大幅提升。

但是依旧没通过测试,不过也只有最后一条超时了,毕竟样本实在是太大了

记录一下今天的收获,算是抛砖引玉吧,不知道有没有更优的解法

python解决双蛋问题相关推荐

  1. 观李永乐老师《双蛋问题》解题后感

    观李永乐老师<双蛋问题>解题后感 题目开始前,随便说几句. 随便说几句,就是随随便便说的,看不懂没关系.随便说,可能会表达得不好,当作阅读前的热身 . 李永乐老师双蛋问题,大概就是讲,给你 ...

  2. 用python解决五格与起名问题

    用python解决五格与起名问题 大二的暑假闲来无事,恰逢python自学刚刚入门,为了巩固知识,于是想通过python来解决日常生活中的一些问题. 关于姓名的学问--五格 如何取一个好听又好看的名字 ...

  3. 双蛋问题的递归解法和循环解法

    python实现李永乐老师的双蛋问题 https://www.bilibili.com/video/av96214853 一个鸡蛋从高楼扔下,在低楼层不会摔碎,高楼层会摔碎,假设楼共100层,找出临界 ...

  4. 面试题-双蛋问题(动态规划)

    肺炎疫情期间,在B站上看了李永乐老师关于双蛋问题的视频,刚好我最近写了一篇关于动态规划的文章,这里我们试着使用动态规划的思想简单分析下这个问题. 一.问题描述 有一座100层的楼,有一个鸡蛋,在低楼层 ...

  5. 高德API+Python解决租房问题

    项目简介:编写Python脚本爬取某租房网站的房源信息,利用高德的 js API 在地图上标出房源地点,划出距离工作地点1小时内可到达的范围,附上公交路径规划功能查看不同路径的用时. 本教程由ekCi ...

  6. Python版本的数据结构书_《用Python解决数据结构与算法问题》

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  7. Python解决The truth value of a Series is ambiguous.md

    Python解决The truth value of a Series is ambiguous.md import pandas as pd data = pd.read_csv('x.csv') ...

  8. python计算学生平均年龄_CodeSalt | Python解决按学生年龄排序的实际问题

    Python解决按学生年龄排序的实际问题 问题:定义一个Class:包含姓名name.性别gender.年龄age,需要按年龄给学生排序. 输入:包含学生对象的List. 输出:按照年龄age进行排序 ...

  9. 用 python 解决汉诺塔问题并附带演示过程

    用 python 解决汉诺塔问题并附带演示过程 参考文章: (1)用 python 解决汉诺塔问题并附带演示过程 (2)https://www.cnblogs.com/shinawear/p/1061 ...

最新文章

  1. Stylus插件开发教程
  2. Javascript(JS)中的大括号{}和中括号[]详解
  3. 【正一专栏】恒大中超七连冠到手了
  4. 《犯罪心理学》读书笔记(part7)--犯罪心理的主观差异(中上)
  5. eureka依赖导入失败以及eureka中没有@EnableEurekaServer异常
  6. 强大的视频格式转换工具——iSkysoft iMedia Converter Deluxe Mac
  7. 商品分类,手机云进销存ERP门店零售批发仓库开单APP软件,文具五金服装鞋帽酒店烟酒饰品批发条码管理
  8. Python全栈自动化测试--Pycharm专业版安装
  9. Android 设备管理器 理解和使用
  10. [文摘20070308]中国历史朝代歌
  11. 币须知道 |马云又抢占了一块高地,蚂蚁金服区块链跨境汇款正式落地,2018世界杯板块排名涨幅第一...
  12. ASO检索规则-热词覆盖如何来做?
  13. MFC更改对话框的背景色
  14. Python 扫雷游戏 完整源代码+图片素材
  15. 【漫步计算机系统】:发展概览Ⅲ
  16. 信息学奥赛一本通:1183:病人排队
  17. 程序员的自我修养——链接、装载与库
  18. 【户外之上,磨房之下系列】20190829强烈要求做单的依梅同学
  19. python 地图偏移_python 地图经纬度转换、纠偏
  20. java从github下载项目_在github下载的java项目通过idea打开(全流程图文,傻瓜式)

热门文章

  1. 图片大小设置background-size
  2. 设置 SSH 保持连接不中断
  3. 7、用css2和css3分别实现垂直居中和水平居中
  4. 【Grasshopper基础12】打造自定义可复用的有按钮电池外观模版
  5. android手机动态壁纸,安卓动态壁纸下载
  6. 话说OpenCL(一)
  7. 微信公众号【黄小斜】为什么值得你关注?
  8. Android校园打车拼车系统 java python 小程序uni-app
  9. 从0开始在vue项目中使用quill编辑器
  10. linux tar.gz zip 解压缩命令