贪心算法-最大容量问题

news2024/11/18 17:47:30

最大容量问题的贪心解法

目录

  • 最大容量问题的贪心解法
    • 问题描述
    • 问题分析
    • 贪心策略
    • 代码实现(C++)
    • 总结
    • C++学习资源

问题描述

给定一个数组ht,其中的每个元素代表一个垂直隔板的高度。我们可以通过任意两个隔板以及它们之间的空间来组成一个容器。容器的容量等于高度和宽度的乘积,其中高度由较短的隔板决定,宽度是两个隔板的数组索引之差。我们的任务是选择两个隔板,使得组成的容器的容量最大。

问题分析

容器由任意两个隔板围成,因此本题的状态为两个隔板的索引,记为[i,j]
根据题意,容量等于高度乘以宽度,其中高度由短板决定,宽度是两隔板的数组索引之差。设容量为cap[i,j]
,则可得计算公式:cap[i,j]=min(ht[i],ht[j])*(j-j)
现选取一个状态[i,j],其满足索引 i<j,且高度ht[i]<ht[j},即i为短板、j为长板。
若将长板向短板靠近,则容量一定变小。
这是因为在移动长板j后,宽度肯定变小;而高度由短板决定,因此高度只可能不变(仍为短板)或变小(移动后的成为短板)。
反向思考,我们只有向内收缩短板i,才有可能使容量变大。因为虽然宽度一定变小,但高度可能会变大(移动后的短板可能会变长)。
由此便可推出本题的贪心策略:初始化两指针,使其分列容器两端,每轮向内收缩短板对应的指针,直至两指针相遇。

贪心策略

  1. 初始化两个指针,分别指向数组的两端。
  2. 计算当前状态的容量cap[i, j] = min(ht[i], ht[j]) * (j - i),并更新最大容量。
  3. 比较两个指针所指的隔板高度,将高度较小的隔板对应的指针向内移动一格。
  4. 重复步骤2和3,直到两个指针相遇。

代码实现(C++)

以下是C++语言的实现代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int maxCapacity(vector<int>& ht) {
    int i = 0;
    int j = ht.size() - 1;
    int res = 0;
    while (i < j) {
        int cap = min(ht[i], ht[j]) * (j - i);
        res = max(res, cap);
        if (ht[i] < ht[j]) {
            i++;
        } else {
            j--;
        }
    }
    return res;
}

void test02() {
    vector<int> v = {3, 8, 5, 2, 7, 7, 3, 4};
    cout << maxCapacity(v) << endl;
}

图片来源hello算法
图片来源hello算法

总结

通过贪心算法,我们能够有效地解决最大容量问题。这种方法简洁且高效,适用于多种类似的问题场景。


C++学习资源

以下是我学习C++觉得不错的资料,仅供学习使用
匠心精作C++从0到1入门编程-学习编程不再难
链接: https://pan.baidu.com/s/1q7NG28V8IKMDGD7CMTn2Lg?pwd=ZYNB 提取码: ZYNB
第二套、侯捷老师全系列八部曲 - 手把手教你进阶系列
链接: https://pan.baidu.com/s/1AYzdguXzbaVZFw1tY6rYJQ?pwd=ZYNB 提取码: ZYNB
C++电子书
链接:https://pan.baidu.com/s/1odQObyuA6ubW6mQ8mAr1Xg
提取码:ZYNB

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

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

相关文章

PostgreSQL16.1(Linux版本离线下载)

1、将数据库压缩包和对应的依赖包上传到对应的目录下。 2、解压数据库文件。 3、解压libicu依赖文件,有两个看对应的版本能装上去即可。 4、进入解压数据库文件的该目录后执行此命令: ./configure --prefix=/usr/local/pgsql 5、输入“make && make install”命令,…

SQL-DCL-数据控制语言

一、 DCL-管理用户 二、DCL-权限控制 一、 DCL-管理用户,主要是DBA数据库管理员使用&#xff0c;开发使用较少 # 1、查询用户 use mysql; show tables; desc user; select * from user; # host为主机地址, 主机地址和用户名确定唯一性# 2、创建用户 create user itcastlocalh…

有哪些好用的文献翻译器推荐?中英文文献翻译软件一览

在平时的生活中&#xff0c;我常常需要阅读一些中英文的文献资料。面对那些生涩难懂的专业术语和复杂的句式结构&#xff0c;我时常感到头疼。 幸运的是&#xff0c;有了中英文文献翻译软件&#xff0c;我的阅读之旅变得轻松了许多。这些软件就像是我的语言助手&#xff0c;帮…

<数据集>航拍牧场奶牛识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1805张 标注数量(xml文件个数)&#xff1a;1805 标注数量(txt文件个数)&#xff1a;1805 标注类别数&#xff1a;1 标注类别名称&#xff1a;[cow] 序号类别名称图片数框数1cow1805141337 使用标注工具&#xff…

黑神话悟空无法登录服务器怎么办

黑神话悟空游戏在登录的时候会遇到无法登录服务器的问题&#xff0c;玩家可以采用一些有效的方法进行解决&#xff0c;其中最主要的措施就是优化网络环境和减少网络干扰。Rak小编为您整理黑神话悟空无法登录服务器如何解决的步骤及注意事项。 优化网络环境 1、当游戏无法登录服…

Android Compose 下拉选择框 ExposedDropdownMenu下拉选择

/*** author 创建人&#xff1a;蒙石瑞* date 创建时间&#xff1a;2024/8/23 10:57* Description 创建内容&#xff1a;下拉选择框*/ OptIn(ExperimentalMaterial3Api::class) Composable fun CustomExposedDropdownMenu(options: List<out DropdownMenuDes>,l…

LLM大模型GPT4o

看图&#xff01; 看图&#xff01; 预训练与微调是现代深度学习模型&#xff0c;特别是自然语言处理模型&#xff0c;常用的两个阶段。 预训练&#xff1a; 在这个阶段&#xff0c;模型在大量的广泛文本数据上进行训练&#xff0c;学习语言的基本结构、语法、词汇和上下文关…

解决使用uniapp时,uni.switchTab跳转标签页面不刷新的问题

我们在使用uni.switchTab跳转到标签页面时&#xff0c;并不会触发这个标签页面的onLoad方法。这是因为在 uni-app中&#xff0c;uni.switchTab用于跳转到指定的标签&#xff08;tab&#xff09;页面。由于标签页面是单实例的&#xff0c;即无论何时切换到该标签页面&#xff0c…

Java二十三种设计模式-解释器模式(23/23)

本文深入探讨了解释器模式&#xff0c;这是一种行为设计模式&#xff0c;用于构建和解释执行自定义语言&#xff0c;提供了实现方法、优点、缺点、与其他模式的比较、最佳实践和替代方案的全面分析&#xff0c;帮助开发者在实际应用中做出明智的设计选择。 解释器模式&#xff…

uniapp(微信小程序如何使用单选框、复选框)

一、先看效果 二、数据结构 说明&#xff1a;selected用来记录每次用户选择的值&#xff0c;当是单选的时候属性中的selected属性需要设置成字符串&#xff0c;当是复选框的时候&#xff0c;此时选择的是数组&#xff0c;selected属性应设置为数组。type用来区分当前是单选还是…

《爬虫+大模型》到底有没有搞头?

最近在学习大模型&#xff0c;之前我是干过一段时间爬虫&#xff0c;在学习大模型的过程中&#xff0c;突发奇想能不能把大模型的能力结合爬虫&#xff0c;搞个AI爬虫玩一玩。 说干就干&#xff0c;先测试一下大模型的数据提取能力 <table width"100%" class&qu…

增强管道数据流转(EPDR)技术的设计局限和替代

在前文中&#xff0c;我们介绍了EPDR技术的起源&#xff0c;以及使用该技术驱动的业余软件无线电平台专栏。已有玩家通过踩坑证明&#xff0c;进程管道交换数据时间延迟大&#xff0c;构造时间敏感系统难。除非采用传统的紧耦合设计及更大的颗粒度&#xff0c;否则很难在期望的…

云计算实训34——docker环境配置、镜像基本操作、容器基本操作、设置远程连接管理

一、配置docker环境 写入模块 [rootdocker ~]# cat << EOF | tee /etc/modules-load.d/k8s.conf > overlay > br_netfilter > EOF 加载模块 #内核模块 [rootdocker ~]# modprobe overlay #桥接模块 [rootdocker ~]# modprobe br_netfilter #查看所添加的模…

物联网安装调试员:振兴杯全国青年职业技能大赛背后的人才培养

一、物联网安装调试员职业概述 1.1 职业定义 物联网安装调试员是信息时代下新兴的职业之一&#xff0c;他们利用先进的检测仪器和专用工具&#xff0c;负责物联网产品的安装、配置和调试工作。这项工作的核心是确保物联网设备能够高效、稳定地运行&#xff0c;实现数据的互联…

【精选】基于数据可视化的智慧社区内网平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

简单的jar包重打包Failed to get nested archive for entry 报错处理

简单的jar包重打包Failed to get nested archive for entry 报错处理 1. 需求 公司有一个后端项目&#xff0c;项目已经打好了jar包&#xff0c;现在我们发现jar包依赖的子包有问题&#xff0c;其中的一个mybatis xml文件查询数据不正确&#xff0c;我们需要替换项目&#xf…

使用Blender进行3D建模—基础操作笔记

Blender 3D 建模&#x1f680; 在博0阶段&#xff0c;目前已经完成立创EDA的PCB绘制的基础学习&#xff0c;树莓派的系统安装远程控制能学习&#xff0c;加上我本硕阶段学习的单片机和深度学习人工智能算法的知识&#xff0c;这里打算补上一块比较重要的能力拼图&#xff0c;就…

集团数字化转型方案(八)

集团数字化转型方案是一项全面而系统的工程&#xff0c;旨在通过构建基于云计算、大数据、人工智能等现代信息技术的企业级数字化平台&#xff0c;对传统的组织结构、业务流程、管理模式实现根本性革新。方案将围绕数据驱动的决策机制、智能化业务流程、数字化的客户体验、平台…

编程实现基于信息熵/基尼指数划分选择的决策树算法

编程实现基于信息熵/基尼指数划分选择的决策树算法 手动建立一个csv文件 #csv的内容为 Idx,color,root,knocks,texture,navel,touch,density,sugar_ratio,label 1,dark_green,curl_up,little_heavily,distinct,sinking,hard_smooth,0.697,0.46,1 2,black,curl_up,heavily,disti…

Linux驱动学习之点灯(五,设备树没用平台设备总线)

创建一个设备树节点 /{led:led{compatible"led";led_pin<&gpio0 22 GPIO_ACTIVE_HIGH &gpio0 21 GPIO_ACTIVE_HIGH>;status"okay";} } OF函数介绍 查找属性 of_gpio_named_count of_gpio_named_count 函数用于获取设备树某个属性里面定…