当前位置: 首页 > news >正文

贪心算法-最大容量问题

最大容量问题的贪心解法

目录

  • 最大容量问题的贪心解法
    • 问题描述
    • 问题分析
    • 贪心策略
    • 代码实现(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.mrgr.cn/news/6772.html

相关文章:

  • Java二十三种设计模式-责任链模式(17/23)
  • 无法找到模块“vuex”的声明文件。“../node_modules/vuex/dist/vuex.mjs”隐式拥有 “any“ 类型。
  • 嵌入式智能移动机器人导航系统:状态空间控制算法、路径规划算法、PID控制算法(代码示例)
  • vue mapActions的使用
  • 泛微E9如何更新缓存
  • Adobe Illustrator矢量绘图软件win/mac软件下载安装
  • LeetCode - 315 计算右侧小于当前元素的个数(Java JS Python C C++)
  • Milvus实践(5) ---- 从attu2.4x窥探Milvus数据结构变化及原理
  • 2024小学生古诗文大会暑期备考:吃透历年真题和知识点(持续)
  • Jmeter 性能测试实战教程
  • 无人机随车飞行技术详解
  • sql中exist和in的区别
  • go+gin+vue入门
  • ThreadLocal解惑
  • pytorch实现模型搭建
  • 卡码网KamaCoder 106. 岛屿的周长
  • 计算机毕业设计选题推荐-花园管理系统-Java/Python项目实战
  • Leetcode 78. 子集
  • 金蝶云星空元数据冲突SVN:replaced,tree conflict树冲突解决过程
  • python 异常处理