广州市番禺区官网seo站群干什么的
news/
2025/10/7 12:26:53/
文章来源:
广州市番禺区官网,seo站群干什么的,伪静态网站配置,门店智能经营平台题目
题目链接
分析
这道题目一定要多读几遍#xff0c;才能理解。
大意就是你有钱budget 和 库存stock的金属零件#xff0c;让你从一堆机器里面选择一种机器可以合成最多金属的数量是多少#xff0c;这些机器合成金属需要的零件数目是不一样的#xff0c;composition…题目
题目链接
分析
这道题目一定要多读几遍才能理解。
大意就是你有钱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;我们的lowhigh区间采用的是 [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, ListListInteger composition, ListInteger stock, ListInteger 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,ListListInteger composition,ListInteger stock,ListInteger cost,int target) {// 遍历所有机器for(ListInteger 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/930405.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!