100楼,2只鸡蛋

扔鸡蛋问题详解(Egg Dropping Puzzle) 经典的动态规划问题,题设是这样的: 如果你有2颗鸡蛋,和一栋36层高的楼,现在你想知道在哪一层楼之下,鸡蛋不会被摔碎,应该如何用最少的测试次数对于任何答案楼层都能够使问题得到解决。 如果你从某一层楼扔下鸡蛋,它没有碎,则这个鸡蛋你可以继续用如果这个鸡蛋摔碎了,则你可以用来测试的鸡蛋减少一个所有鸡蛋的质量相同(都会在同一楼层以上摔碎)对于一个鸡蛋,如果其在楼层i扔下的时候摔碎了,对于任何 阅读详情
/*
  100楼,2只鸡蛋,要求用最少次数确定鸡蛋可以从多高摔下而不破。

  鸡蛋和楼容易被人钻牛角尖,所以换个更普通的命题来讨论下:

  有M种“越来越差”的环境(编号1至M)

  有N个“完全相同”的样品,样品在第i种环境下的测试结果有两种:
    成功  样品完全无损
    失败  样品损坏,无法再用

  性质1:若样品测试第k种情况时成功,表示所有样品都能够通过环境1至k。
  性质2:若样品测试第k种情况时失败,表示所有样品都不能通过环境k至M。

  要求用最少的次数,测出探针可承受的最差环境编号。

  结合性质1、2,可知每次测试的结果都将把未知区域分成两部分。

  假设在用掉了N-1个探针后,成功通过的环境编号最大的为a,失败的环境编号最小为b
  只剩最后一个探针,为了完成任务,只能从a依次测试到b
  不能跳过中间环境,直接测试后面的,因为一旦失败,就无法确定最差环境。
*/

#include <cassert>
#include <iostream>
#include <cmath>
using namespace std;

int const N = 100;

int g_solve[N + 2][N + 2][N + 2];

int min_test_times(int success, int failure, int probe_count)
{
  if(g_solve[success][failure][probe_count] >= 0){
    return g_solve[success][failure][probe_count];
  }

  int unknown_cases = failure - success - 1;
  if(unknown_cases <= 1){
//cout << "B\t" << success << '\t' << failure << '\t' << probe_count << '\t' << 1 << endl;
    g_solve[success][failure][probe_count] = 1;
    return 1;
  }

  if(probe_count == 1){ // 只有一个探针,只能依次试
//cout << "C\t" << success << '\t' << failure << '\t' << probe_count << '\t' << unknown_cases << endl;
    g_solve[success][failure][probe_count] = unknown_cases;
    return unknown_cases;
  }

  int min_times = 0x7FFFFFFF;
  for(int step = 1, MAX_STEP = ceil(unknown_cases * 0.5); step <= MAX_STEP; ++step){
    int segments = ceil(double(unknown_cases) / step);
    int bound = success + step * (segments-1);
    int t = 0;
    if(segments >= 2){
      int a = (segments - 1) + min_test_times(bound - step, bound, probe_count - 1); // 失败
      if(a > t){
        t = a;
      }
    }

    if(segments >= 1){
      int b = (segments - 1) + min_test_times(bound, failure, probe_count); // 成功,probe数量不变
      if(b > t){
        t = b;
      }
    }

    if(t < min_times){
      min_times = t;
    }
  }

//cout << "D\t" << success << '\t' << failure << '\t' << probe_count << '\t' << min_times << endl;
  g_solve[success][failure][probe_count] = min_times;
  return min_times;
}

void clearCache()
{
  int const UNKNOWN = -1;

  for(int i = 0; i < N + 2; ++i){
    for(int j = 0; j < N + 2; ++j){
      for(int k = 0; k < N + 2; ++k){
        g_solve[i][j][k] = UNKNOWN;
      }
    }
  }
}

int main()
{
  clearCache();

  for(int i = 1; i < 11; ++i){
    cout << '\t' << i << "\t" << min_test_times(0, 101, i) << endl;
  }
  return 0;
}


结果(样品个数、所需试验次数),结果看着“象是正确的”,样品超过二分查找所需的个数后再多也不会有提高了:

1       100
2       18
3       11
4       9
5       8
6       7
7       7
8       7
9       7
高层扔鸡蛋问题 - 算法及其优化 文章目录基本问题:2个鸡蛋,100层楼问题描述问题分析数学解释问题升级:2个鸡蛋,n层楼问题描述算法分析问题再升级:k个鸡蛋,n层楼算法分析程序设计 基本问题:2个鸡蛋,100层楼 先看生活版的问题 问题描述 一栋高楼共有100层,鸡蛋从某个楼层(和此楼层以上高度)掉下来恰好会碎。现在小明手中有2个鸡蛋,他需要怎样才能尽快找出这个临界的楼层?(即在最坏情况下小明需要最少需要多少次才能找到答案) 问... 阅读详情

相关推荐

mmpretrain学习笔记

(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’(7)适当的修改num_workers、epochs、batch_size、lr等。3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等。my_resnet18_8xb32_in1k.py 完整的配置文件。(6)split=‘train’、split='val’注释掉。2、数据:数据集划分、数据文件路径、批大小、数据增强策略等。

吃葡萄不吐葡萄皮 936

2个鸡蛋100楼问题

https://www.cnblogs.com/yangai/p/5391533.html 博客1 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。 有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。 最少需要几次测试,才能得到摔碎鸡蛋的楼层?方案如何? =========================...

不远远方 1246

如何将TDengine集成到Thingsboard?

1 概述 ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议MQTT、CoAP和HTTP实现设备连接,并支持云和本地部署。 ThingsBoard迄今没有导入专业的时序数据库应用,用户可选择的只有PostgreSQL和Cassandra。虽然针对PostgreSQL引入了TimeScale插件,但由于其不是按照宽表的方式组织数据记录,TimeScale的优势根本发挥不出来。总之,这两种数据库不具备高效的数据吞吐能力。 而且,Thingsboard在

Wearable_device的博客 4765

有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。

有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下不会摔破。给你2个鸡蛋,设计方案找出N,并且保证在最坏情况下, 最小化鸡蛋下落的次数。(假设每次摔落时,如果没有摔碎,则不会给鸡蛋带来损耗)

heyuchang666的专栏 1万+

xlinx项目系列之基于zynq-7020ISP图像处理

本Demo基于zynq-7020(正点原子启明星+OV5640+4.3'800x480)实现了ISP图像处理(将ov5640的isp关闭,在7020上实现ISP功能),输出到LCD和HDMI,软件基于SDK裸机开发,2592x1944@15fp。位置: xil_ip_repo/xil_isp_lite_1.0。项目获取链接:2.基于zynq-7020实现ISP图像处理。位置: xil_ip_repo/xil_vip_1.0。

JY6669991010的博客 2635

U盘安装单系统ubuntu10.04之全过程&拔掉U盘后系统无法启动

借助U盘把电脑装成ubuntu单系统之过程记录,以及遇到拔掉U盘后系统无法启动问题,电脑就显示: Non-System disk or disk error, replace and strike any key when ready

CXHPLY的专栏 8678

2个鸡蛋,100层楼问题

https://blog.youkuaiyun.com/Sirius_han/article/details/81152572 题目: 现有两个硬度相同的鸡蛋,以及一栋100层的楼,如果鸡蛋在第n层楼摔下去不会碎,在n-1层楼摔下去会碎,那么鸡蛋的硬度是n,如果要测出鸡蛋的硬度n,在最坏情况下最少要测试几次?每测试一次就把一个鸡蛋从x层楼扔下去;只有两个鸡蛋可用,鸡蛋摔碎了就不能用了; 题目分析: 1...

孔孔的博客 2901

VScode搭建Opencv(C++开发环境)

VScode配置Opencv一、准备软件二 、下载软件1、MinGw下载2、 Cmake下载3、Opencv下载三、编译1、cmake-gui2、make3、install四、 VScode配置1、launch.json2、c_cpp_properties.json3、tasks.json五、测试 用了半天事件,看了各种的博客终于配置成功了,在这里记录并分享一下,让更多的人少走弯路。 本次环境是Win 10. 一、准备软件 我们本次用到的3个软件,(建议读者文件路径,文件版本 尽量都和我相同,这样不容易出错

河旬的博客 8万+

100层楼扔2个鸡蛋、3个鸡蛋……

原题目 现有2个鸡蛋,楼高100层,假设从n层楼及以上扔下会摔碎,n层以下不会,那么怎样扔能以最小的次数得到n? 分析 最先想起来的是二分法的题目:100层最少需要扔多少次鸡蛋才能求得n?答案是ceil(log2(100))=7 。不过现在只有两个鸡蛋,这种方法就不行了。采用二分法的话,如果1号蛋在50层碎了,那剩下一个鸡蛋只能从1层开始慢慢扔了,需要扔1+49 = 50次。 另外一种容易

Focustc 2万+

深度学习CV八股文

深度学习CV八股文一、深度学习中解决过拟合方法L1和L2正则化DropoutDropout正则化Inverted Dropout(反向随机失活)Dropout起到正则化效果的原因:Dropout的缺点eargstopping ( 早停法 )二、深度学习中解决欠拟合方法三、梯度消失和梯度爆炸解决梯度消失的方法解决梯度爆炸的方法四、神经网络权重初始化方法Xavier指数加权移动平均数五、梯度下降法梯度下降SGD(随机梯度下降法)Momentum(动量梯度下降)Nesterov Momentum自适应学习率算法A

填坑 2万+

NLM去噪算法:原理、优化与医学图像处理实战

本文深入解析NLM去噪算法的核心原理及其在医学图像处理中的优化应用。通过全局自相似性计算,NLM算法有效抑制噪声并保留细节,特别适用于超声图像斑点噪声处理。文章还介绍了积分图像和傅里叶变换等优化技巧,显著提升计算效率,并分享医学影像项目中的实用调参经验。

weixin_29051149的博客 346

100层楼扔两个鸡蛋的问题

两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。      有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。      最少需要几次测试,才能得到摔碎鸡蛋的楼层?方案如何? =================================================  对于这个问

kongxinyue的专栏 2321

用Python实现古诗词填字游戏(三)

古诗词做填字游戏的第三部分代码,也是最核心的部分。实现对诗文和关键字的选定,并确定文字的输出位置。

PosPro的专栏 6117

100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34419321的博客 298

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

100层楼2个鸡蛋,测试其最低破碎楼层问题

原文章链接 http://www.cnblogs.com/yangai/p/5391533.html http://www.tuicool.com/articles/NzUNJr http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破, 在第N层以下的楼层落下

Madoka_Homura的博客 9331

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

100层楼扔鸡蛋,最快速度找出,哪层是鸡蛋碎的临界点

x*(x+1)/2=100层楼,x为最优解 第二天 题目:扔鸡蛋问题 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。 问:如何用最少的尝试次数...

chunqingtai2922的博客 1176

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[转]动态规划-100层楼扔鸡蛋问题

x*(x+1)/2=100层楼,x为最优解  第二天         题目:扔鸡蛋问题   有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,...

aBen_Dan的博客 1025

关于两个鸡蛋判断楼层问题

问题: 经典的问题,给你两个鸡蛋,从100层楼上往下扔,从某个楼层开始,鸡蛋开始碎,请问最少扔多少次可以判断出楼层。 分析: 问题是经典的面试题,100层数据应该是14次,今天群里面同学给了一个解析解,(n+1)*n / 2这个通项解,直观上理解就是每次扔鸡蛋的楼层减1,第一次站在14楼扔,如果不碎,另一个鸡蛋从1楼开始往上走;如果14楼没碎,我们从(14+13)楼往下扔,如果没有碎,我们从

lxmky的专栏 5468

转:100层楼扔两个鸡蛋的问题

转自:http://blog.sina.com.cn/s/blog_6c813dbd0101bh98.html 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。 有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。 最少需要几次测试,才能得到摔碎鸡蛋的楼层?方案如何? =====================...

weixin_34319999的博客 159

两个鸡蛋和一百层楼的问题

两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。   有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。   最少需要几次测试,才能得到摔碎鸡蛋的楼层?方案如何? =============================正确答案是============================= 14

u011878387的专栏 1579

【力扣刷题】两个鸡蛋掉落

给你2 枚相同的鸡蛋,和一栋从第1层到第n层共有n层楼的建筑。 已知存在楼层f,满足0

代码基地 490

no.6 _扔鸡蛋问题

一栋楼有100层,在第N层或者更高扔鸡蛋会破,而第N层往下则不会。给2个鸡蛋, 求N,要求最差的情况下扔鸡蛋的次数最少。 我们先假设最坏情况下,鸡蛋下落次数为x,即我们为了找出N,一共用鸡蛋做了x次的实验。 那么,我们第一次应该在哪层楼往下扔鸡蛋呢?先让我们假设第一次是在第y层楼扔的鸡蛋, 如果第一个鸡蛋在第一次扔就碎了,我们就只剩下一个鸡蛋,要用它准确地找出N, 只能从第一层向上...

乔治大哥的博客 612

谷歌公司经典面试题扔鸡蛋的详细解读(一)

首先说一下大概的题目 题目:扔鸡蛋问题 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。 问:如何用最少的尝试次数,测试出鸡蛋不会摔碎的临界点?   可以想象,最关键的地方有两个,一个是如何尝试的次数最少,还有最最重要的一点,你只有两个鸡蛋,都碎了就没办法找了这个地方也是我一开始忽略的地方,导致我不明...

熊仙森滴Blog 1万+
上一篇: 察看 Glibc 的版本
下一篇: CommonLisp标识符统计
CodeArhat
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值