LeetCode.2861. 最大合金数

题目

题目链接

分析

这道题目一定要多读几遍,才能理解。

大意就是你有钱budget 和 库存stock的金属零件,让你从一堆机器里面选择一种机器可以合成最多金属的数量是多少,这些机器合成金属需要的零件数目是不一样的,composition 数组给你了每个机器合成金属需要的零件数量,而且你还有每个零件的库存 stock 数组,当然你可以买合成金属需要的零件,每个零件的需要的金钱cost数组,但是你只有 budget 钱,问:使用其中的某台机器,能合成金属的最大数量。

这道题目有一个很重要的点就是:所有合金都需要由同一台机器制造。这个非常非常非常重要。

  • 合金数量越多,价格就越高,具有一定的单调性。适合二分查找。假设可以合成的金属的最大数量为 x,则一定可以制造小于 x 数量的金属,并且一定不能制造大于 x的金属。
  • 一般二分查找需要一个low,一个 high,我们这道题目,做少能合成金属数目就是0即low= 0,最大能合成金属的数目你可以直接使用 Integer.MAX_VALUE。或者你也可以缩小一个 high 的大小,我们可以假设合成金属需要的每个零件需要1,那么我们库存能合成的金属数量就是 Collections.min(stock),我们钱可以买的零件最大值就是每个零件只需要1,所以能买零件合成合金的数量为 budget ,所以 high 你也可以初始值为 high = Collections.min(stock) + budget;
  • 我们的low,high区间采用的是 [low,high],左闭右闭区间,这点很重要哦,对于我们后面 low和 high的移动很重要。
  • 因为二分,所以出现判断中间位置 target = left + (high - low) / 2;
  • 接下来就是判断所有机器是否存在一台机器可以合成 target 数量的金属了,方法如下:分别计算每台机器制造 target 数量的合金的总预算,如果存在一台机器能制造 target 的合金,就代表可以制造出 target 份合金,先把这个数字记录下来,在接着判断还能不能合成更大数量的合金,left = targrt + 1;否则则不能制造 target 份合金,high = target - 1;
  • 接下来的问题就是如何判断你手上的库存加上你手上的钱,是否存在一台机器能制造 target 数量的合金,这个方法如下:计算一下每台机器需要合成target数量的合金需要的钱,然后跟我们现有的钱进行比较,如果小于等于,代表存在一台机器能制造target数量的合金。
  • 接下来的问题就是如何知道每台机器合成target数量合金的时候需要的金钱。遍历composition 可以得到每台机器machine,遍历machine可以得到每台机器需要的零件数量,零件i已有的数量 stock[i],要合成target数量的合金需要购买零件i的数量additional = Math.max((long) machine.get(i) * target - stock.get(i),0);购买零件 i 需要的钱 additional * const.get(i),累加当前机器买每个零件需要的钱 totalCoins ,如果这个数字 小于等于 你有的钱budget,才继续遍历,遍历完当前机器machine所需要购买零件,得到总需要的钱 totalCoins 和 budget比较,小于等于就返回 true,代表这批机器存在一台能合成target数量的合金。

代码

class Solution {public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {int low = 0, high = Collections.min(stock) + budget;// [low,high] :区间为左闭右闭int res = 0;while (low <= high) {int mid = low + (high - low) / 2;if(isPossible(n,budget,composition,stock,cost,mid)) {// 当前 mid 数量的合金机器可以合成 ,记录下来res = mid;low = mid + 1;}else {high = mid - 1;}}return res;}// 所有机器能不能制造 target 数量的合金public boolean isPossible(int n,int budget,List<List<Integer>> composition,List<Integer> stock,List<Integer> cost,int target) {// 遍历所有机器for(List<Integer> machine: composition) {// 当前机器合成 target 数量的合金需要的金钱总和long totalCoins = 0;for(int i = 0;i < n && totalCoins <= budget ;i ++) {// 当前机器合成 target 数量的合金需要购买的 零件i 的数量long additional = Math.max((long)machine.get(i) * target - stock.get(i),0);totalCoins += additional * cost.get(i);}if(totalCoins <= budget) {return true;}}return false;}
}

在这里插入图片描述

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

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

相关文章

美易平台:金融市场的晴雨表与创新服务的融合

在金融市场中&#xff0c;利率的微妙变动往往预示着经济活动的脉动&#xff0c;而美国纽约联储发布的最新数据显示&#xff0c;上个交易日&#xff08;1月25日&#xff09;担保隔夜融资利率&#xff08;SOFR&#xff09;小幅上升至5.32%&#xff0c;而同期有效的联邦基金利率保…

程序员必备!10款实用便捷的Git可视化管理工具

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。我们在团队开发中统一某个开发工具的使用能够大大降低沟通成本&#xff0c;提高协作沟通效率。今天给大家分享10款实用便捷的Git可视化管理工…

数与抽象之抽象方法

抽象方法 几年前&#xff0c;《泰晤士报文学增刊》的一篇评论在开篇写道&#xff1a; 已知000以及1x11&#xff0c;就可以得到&#xff1a;平方等于自身的数是存在的。但是再进一步&#xff0c;我们就可以得到&#xff1a;数是存在的。经过这简简单单朴实无华的一步&#xff0…

STM32完全学习手册

1. 了解STM32微控制器 了解STM32系列&#xff1a; 了解STM32系列微控制器的不同型号和系列&#xff0c;以及它们的特点和应用领域。 学习基础理论知识&#xff1a; 学习嵌入式系统和微控制器&#xff08;ARM)的基础知识&#xff0c;包括处理器架构、外设、时钟和中断等。 2.…

前端组件封装

组件封装是前端开发中常用的技术手段&#xff0c;它的目的是为了实现代码的重用、提高开发效率和代码质量。在组件封装过程中&#xff0c;需要注意以下几个方面&#xff1a; 分析布局&#xff1a;首先需要对布局进行分析&#xff0c;确定组件的结构和样式。了解组件在不同场景…

(免费领源码)java#SSM#mysql疫情时期人员流调平台69124-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1研究意义 1.2开发现状 1.3系统开发技术的特色 1.4 ssm框架介绍 1.5论文结构与章节安排 2 疫情时期人员流调平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1…

VisionMaster图像拼接功能实现

由于硬件或安装环境限制&#xff0c;单个相机视野无法覆盖整个视野&#xff0c;但实际应用需要全视野图像时&#xff0c;可以拍摄物体的多个部分拼接成一张整图。VM提供图像拼接工具对图像进行拼接。 使用标定图进行标定建模是最重要的一步&#xff0c;成功标定后可以将图像无…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-帖子管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

【c++】高精度算法(洛谷刷题2024)扫雷游戏详解

系列文章目录 第二题&#xff1a;扫雷游戏 视频讲解&#xff1a;http://【洛谷题单 - 算法 - 高精度】https://www.bilibili.com/video/BV1Ym4y1s7BD?vd_source66a11ab493493f42b08b31246a932bbb 文章目录 目录 系列文章目录 文章目录 前言 一、题目分析以及思考 二、代…

多维时序 | Matlab实现CNN-BiGRU-Mutilhead-Attention卷积双向门控循环单元融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-BiGRU-Mutilhead-Attention卷积双向门控循环单元融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiGRU-Mutilhead-Attention卷积双向门控循环单元融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一…

qemu的安装

1、简介 QEMU&#xff08;Quick EMUlator&#xff09;是一个开源的处理器模拟器&#xff0c;它可以在一种硬件平台上模拟另一种硬件平台&#xff0c;从而运行各种不同的操作系统。QEMU通过动态二进制翻译来实现高性能的模拟&#xff0c;这使得它可以在接近原生性能的速度下运行…

21.云原生之ArgoCD CICD实战(部分待补充)

云原生专栏大纲 文章目录 部署项目介绍项目结构介绍GitLab CI/CDGitLab CI/CD主要特点和功能 部署测试argocd的cd过程CICD工作流准备工作github中工作流文件创建gitlab中工作流文件创建【实操待补充】GitLab CI示例 数据加密之seale sealedBitnami Sealed Secrets介绍Bitnami …

basicPython-1

元组 """ 目录: 1.创建元组 2.元组的拼接 3.元组的解压赋值 4.元组的切片 5.元组的元素的索引 6.元组的嵌套 7.统计某个元素的个数 """"""创建元组(元组不可变)""" # 1.强制:tuple() # 2.普通 tuple_0 (1,) tup…

python 通过openwire协议 连接activemq

要使用Python通过OpenWire协议连接ActiveMQ&#xff0c;您需要使用支持OpenWire协议的库。在Python中&#xff0c;pyactivemq是一个流行的库&#xff0c;可以用于与ActiveMQ进行交互。 首先&#xff0c;您需要安装pyactivemq库。您可以使用pip来安装它&#xff1a; pip instal…

MYSQL表的约束详解!

文章目录 前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据…

VS生成报错:MSB8036 The Windows SDK version 8.1 was not found.找不到 Windows SDK 版本 8.1

目录 一、查看本机SDK二、 解决法一&#xff1a;适配本电脑的SDK法二&#xff1a;下载SDK 8.1 VS生成报错&#xff1a;MSB8036 找不到 Windows SDK 版本 8.1。请安装所需版本的 Windows SDK&#xff0c;或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更…

NAT地址转换协议

目录 NAT应用场景静态NAT动态NATNAPTEasy IPNAT服务器 点击跳转NAT配置&#xff08;动态nat&#xff0c;静态nat&#xff0c;Easy IP&#xff09; NAT应用场景 - 随着网络设备的数量不断增长&#xff0c;对IPv4地址的需求也不断增加&#xff0c;导致可用IPv4地址空间逐渐耗尽…

代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II

122.买卖股票的最佳时机II 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a;只算正利润 java&#xff1a; class Solution {public int maxProfit(int[] prices) {int result 0;for (int i 1; i < p…

C++17中lambda表达式新增加支持的features

C17中对lambda表达式新增加了2种features&#xff1a;lambda capture of *this和constexpr lambda 1.lambda capture of *this: *this:拷贝当前对象,创建副本&#xff1a;捕获*this意味着该lambda生成的闭包将存储当前对象的一份拷贝 。 this:通过引用捕获。 当你需…

淘宝API接口调用:案例分析与最佳实践(续)

进阶应用探讨 应用1&#xff1a;多渠道同步 在多渠道经营中&#xff0c;商家需要在不同的平台之间同步商品信息、库存和订单状态。利用淘宝API&#xff0c;商家可以自动化这一过程&#xff0c;减少人工操作的错误率和时间成本。例如&#xff0c;当一个商品在淘宝店铺售出时&a…