高楼扔鸡蛋问题

news2024/9/21 14:26:35

1.对应letecode链接
高楼扔鸡蛋问题

2.题目描述
在这里插入图片描述

解题思路

题目是这样:你面前有一栋从 1 到 N 共 N 层的楼,然后给你 K 个鸡蛋(K 至少为 1)。现在确定这栋楼存在楼层 0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于 F 的楼层都会碎,低于 F 的楼层都不会碎)。现在问你,最坏情况下,你至少要扔几次鸡蛋,才能确定这个楼层 F 呢?
也就是让你找摔不碎鸡蛋的最高楼层 F,但什么叫最坏情况至少要扔几次呢?我们分别举个例子就明白了。我们首先不用理这个鸡蛋的个数,现在假设有8层楼。我们在第一层楼开始扔这个鸡蛋。如果没碎那么我们就可以接着第二层扔这个鸡蛋,如果还没碎我们可以接着第三层开始扔。如果一直没碎的话我们最坏的情况下是不是需要尝试这个8次。而至少需要扔几次这又是什么意思?因为我们可以选择在第几号楼开始扔这个鸡蛋。假设我们现在在s层楼开始扔鸡蛋无非就只有两种情况一种是这个碎了,另外一种就是没碎。如果碎了的话那么答案只有可能在s-1层中,如果没碎那么答案在这个n-s层之中.在这一层开始扔的答案就是这个这两种情况下最坏的那种。随着我们开始扔鸡蛋层数的不同那么这个最话的这个结果也肯定不同。那么只需要在这么多结果当中选择代价最少的那种就可以了。

在这里插入图片描述
在这里需要注意的是如果鸡蛋没碎那么这个第i层我们可以将其当中这个第0层。下面我们来看看这个代码如何来书写。

class Solution {
  public:
    int superEggDrop(int k, int n) {
        return process(k, n);
    }
    //一共有n层楼k个鸡蛋返回最小扔鸡蛋的次数
    int process(int k, int n) {
        //如果只有一个鸡蛋那么最坏的情况下肯定是需要扔k层的
        if (k == 1) {
            return n;
        }
        //0层楼不用试肯定是0次
        if (n == 0) {
            return 0;
        }
        int ans = INT_MAX;
        for (int i = 1; i <= n; i++) {
            //枚举所有开始扔鸡蛋的层数在所有结果当中选择代价最小的一个
            ans = min(ans, max(process(k - 1, i - 1), process(k, n - i)) + 1);
        }
        return ans;
    }
};

但是这样很暴力即使我们加了这个记忆化搜索我们也过不了。下面我们看看这个记忆化搜索的代码如何实现。

class Solution {
  public:
     vector<vector<int>>dp;
    int superEggDrop(int k, int n) {
        dp.resize(k+1,vector<int>(n+1,-1));
        return process(k, n);
    }
    //一共有n层楼k个鸡蛋返回最小扔鸡蛋的次数
    int process(int k, int n) {
        //如果只有一个鸡蛋那么最坏的情况下肯定是需要扔k层的
        if (k == 1) {
            return n;
        }
        //0层楼不用试肯定是0次
        if (n == 0) {
            return 0;
        }
        if(dp[k][n]!=-1)
        {
            return dp[k][n];
        }
        int ans = INT_MAX;
        for (int i = 1; i <= n; i++) {
            //枚举所有开始扔鸡蛋的层数在所有结果当中选择代价最小的一个
            ans = min(ans, max(process(k - 1, i - 1), process(k, n - i)) + 1);
        }
        dp[k][n]=ans;
        return ans;
    }
};

下面我们来看看这个方法二:
方法二有点偏数学方法,非常的难想到利用函数单调性进行二分。并不是像刚才那样一层楼一层楼的进行枚举,把枚举的过程做了一点优化。
在这里插入图片描述
我们可以看到dp(K,N)他只依赖这个。dp(K-1,i-1)和这个dp(K,N-i)如果我们把考虑鸡蛋的个数,而且那么dp(K-1,i-1)是单调递增的函数而这个dp(K,N-i)是这个单调递减的函数。我们要求他们两个的最大值最小的那个。当这两个函数相等的时候这个时候是最优解。下面我们看看这几种情况。

情况 1:最低点只有 1 个点
在这里插入图片描述

情况 2:最低点是若干个重合的点

在这里插入图片描述

情况 3:最低点不重合,但是两边的值一样

在这里插入图片描述
从图上可以看出:二者的较大值的最小点在它们交汇的地方。那么有没有可能不交汇,当然有可能(上面第 3 张图),二者较大值的最小者一定出现在画成曲线段交点的两侧,并且二者的差值不会超过 1,也就是如果没有重合的点,两边的最大值是一样的(从图上看出来的,没有严格证明),因此取左侧和右侧两点中的一点都可以,不失一般性,可以取左边的那个点的 k。也就是找到使得 dp[i - k][j] <= dp[k - i][j - 1] 最大的那个 k 值即可。

下面我们来看看代码如何来书写

class Solution {
public:
    vector<vector<int>>dp;
    int superEggDrop(int k, int n) {
        dp.resize(k+1,vector<int>(n+1,-1));
          return process(k,n);
    }

    int process(int k,int n)
    {
        if(k==1){
            return n;
        }
        if(n==0){
            return 0;
        }
        if(dp[k][n]!=-1)
        {
            return dp[k][n];
        }
        int ans=-1;
        int L=1;
        int R=n;
        //找到这个大于等于这个最大的数字
        while(L<=R)
        {
            int mid=(L+R)/2;
            int l=process(k-1,mid-1);
            int r=process(k,n-mid);
            if(l<=r){
                ans=mid;
                L=mid+1;
            }else{
                R=mid-1;
            }
        }
          //在这一层肯定是这个最优的
        dp[k][n]=max(process(k-1,ans-1),process(k,n-ans))+1;
        return dp[k][n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows使用ssh协议远程连接ubuntu linux子系统

Windows使用ssh协议远程连接ubuntu linux子系统一、Windows远程连接ubuntu linux子系统二、开启ubuntu ssh服务三、获取ubuntu子系统的ip地址四、从windows上通过ssh连接到ubuntu子系统五、后记一、Windows远程连接ubuntu linux子系统 当我们在windows上安装好ubuntu子系统后&…

Linux命令总结详细

Linux命令总结详细1.前言2.基础知识2.1.执行命令格式2.2.帮助命令2.2.1.man命令2.3.部分快捷键2.3.1.Tab键2.3.2.Ctrlc组合键2.3.3.Ctrll组合键2.4.服务运行命令2.5.服务开机启动命令3.系统工作命令3.1.date时间命令3.1.1.命令解释3.1.2.命令参数3.1.3.案例3.2.reboot重启命令3…

ESP-01S使用AT指令连接阿里云

这次分享下ESP8266-01S使用AT指令连接阿里云&#xff0c;为了后面stm32--esp-01s-阿里云&#xff08;MQTT&#xff09;做铺垫 目录 步骤&#xff1a; 1.烧录阿里云固件 首先我们打开->安信可官网下载阿里云的固件&#xff0c;如图 1.1串口助手与esp-01s接线说明 注&am…

C语言——VS2019实用调试技巧

前言 要想成为一个合格的程序员&#xff0c;不仅仅要会写代码&#xff0c;更要会调试代码。咔咔一通敲代码&#xff0c;敲出了BUG&#xff0c;这时就分两种程序员&#xff0c;一种是质疑编译器的程序员&#xff0c;“什么&#xff1f;我写出了BUG&#xff0c;是不是机器出了问…

什么是混淆矩阵精度、召回率、准确性、F1 分数、FPR、FNR、TPR、TNR?

在你的数据科学生涯的开始,混淆矩阵会非常混乱,我们会有很多问题,比如什么时候使用精度?什么时候使用召回?在哪些情况下可以使用精度?因此,我将尝试在本博客中回答这些问题。 什么是混淆矩阵? 混淆矩阵是一种将预测结果和实际值以矩阵形式汇总的方法,用来衡量分类问题…

带头双向循环链表的实现

目录前言节点声明链表的初始化尾插打印链表头插尾删头删查找节点指定位置插入指定位置删除链表销毁前言 之前讲过单链表的实现&#xff0c;在实现的过程中&#xff0c;我们会发现每次删除或者在前面插入节点的时候&#xff0c;都要提前保存上一个节点的地址。这样做十分麻烦&a…

大一新生HTML期末作业个人介绍博客 使用html+css+javascript+jquery技术制作网页,含有动画,hover效果,含有表格布局

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

RV1126/RV1109 IPC板 + RK3568+鸿蒙AI视频解决方案

近年来&#xff0c;云终端产品在办公、教育、工控等行业被广泛应用&#xff0c;其具有实用性强、运维量小、数据存储更安全等特点&#xff0c;深受市场青睐。而面对复杂光照环境、人流与车流、多变人体动作等复杂场景&#xff0c;成像质量和画面效果以及细节呈现能力&#xff0…

Ansible自动化运维工具之playbook剧本编写(上)

内容预知 1.playbook的相关知识 1.1 playbook 的简介 1.2 playbook的 各部分组成 2. 基础的playbook剧本编写实例 实例1&#xff1a;playbook编写 apache的yum安装部署剧本 实例2&#xff1a;playbook编写nginx 的yum安装并且能修改其监听端口的剧本 3. playbook的定义、引…

网站如何快速变成灰色?,几行代码就搞定了!

当大家看到全站的内容都变成了灰色&#xff0c;包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢&#xff1f;有人会以为所有的内容都统一换了一个 CSS 样式&#xff0c;图片也全换成灰色的了&#xff0c;按钮等样式也统一换成了灰色样式。但你想想这个成本也太高了&…

ThreadLocal笔记

并发的场景中&#xff0c;如果有多个线程同时修改公共变量&#xff0c;可能会出现线程安全问题&#xff0c;即该变量最终结果可能出现异常。 如果使用锁来保证资源隔离&#xff0c;会存在大量锁等待&#xff0c;会让响应时间延长很多。 ThreadLocal的核心思想是&#xff1a;共享…

云服务器centos8搭建网站 apache+php+mysql

由于对数据库容量要求比较大&#xff0c;年费用300左右的普通虚拟主机只能提供500M-1G的数据库&#xff0c;不能满足要求&#xff0c;故寻找到同样费用的云服务器单核、1G内存、系统盘50G&#xff0c;缺点是只提供基本系统centos&#xff0c;其他要自己搭建&#xff0c;经过一周…

05_openstack之Neutron网络管理

目录 一、环境准备 二、通过Horizon设置外部网络 1、创建外网网络 2、创建内网网络 3、创建路由 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 创建项目和用户&#xff1a;03_openstack之项目及用户管理_桂安…

fastTEXT论文解读并附实例代码

上一篇博文是入门使用级别&#xff0c;但对于面试来说则不够&#xff0c;毕竟领导一问三不知必定over&#xff0c;其基本原理还是要搞清楚&#xff0c;因而有此博文。paper在此 0&#xff0c;绪论 考虑紧致特征以减少存储空间&#xff0c;提出在PQ&#xff08; product quant…

三、CANdelaStudio入门-视图类型(View type)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的各个视图类型:Standard View、Expert V…

Jmeter的使用教程(安装)

前言&#xff1a;之前在工作中未接触过Jmeter&#xff0c;只是知道这个Java语言开发的工具主要是测试接口的&#xff0c;还能做一些性能和压力的测试、并发什么的。目前市面上的有postman、apifox&#xff0c;request、swagger。 一、下载&#xff1a; 1、可以直接到官网下载&a…

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

在这里先声明一下&#xff0c;级联CESO由美国学者Rafal Madonski的论文 《Cascade extended state observer for active disturbance rejection control applications under measurement noise》提出&#xff0c;本人只是将他给的模型给中国学者研究&#xff0c; 模型适用于各…

做了几年“斜杠青年”,我在ZStack立志做国产云计算的研发

在浅黑科技《ZStack&#xff1a;这群做云的人有点“轴”》一文中&#xff0c;作者史中提到&#xff0c;这是一篇国产云计算佼佼者ZStack的创业史&#xff0c;文中记录了因为热爱而聚集起来的最早一批ZStacker&#xff0c;他们生活没有退路&#xff0c;但热爱未有止息。 实际上…

概率论与数理统计_第1章_几何概型

1 定义 若一个试验具有下列两个特征&#xff1a; &#xff08;1&#xff09;试验的所有可能结果是无限多个&#xff0c; 且全体结果可以用一个有度量的几何区域 Ω 来表示&#xff1b; &#xff08;2&#xff09;每个可能结果 都相同概率可能发生&#xff0c; 则该试验称为几何…

Pytorch:Torch数据类型学习整理与记录

文章目录前言一、Tensor数据类型简介Tensor数据类型是什么?Tensor数据类型有哪些指定调用的API生成相关数据类型dtype属性指定Tensor内置的简单数据类型二、Tensor数据类型的基本使用Tensor初始化基于list列表和nparrayTensor相关API基于指定Tensor类型进行初始化基于Randn生成…