【力扣每日一题】力扣2861最大合金数

题目来源

力扣2861最大合金数

题目概述

假设你是一家合金制造公司的老板,你的公司使用多种金属来制造合金。现在共有 n 种不同类型的金属可以使用,并且你可以使用 k 台机器来制造合金。每台机器都需要特定数量的每种金属来创建合金。

对于第 i 台机器而言,创建合金需要** compositionij** 份 j 类型金属。最初,你拥有 stocki 份 i 类型金属,而每购入一份 i 类型金属需要花费 costi 的金钱。

给你整数 n 、k 、budget ,下标从 1 开始的二维数组 composition ,两个下标从 1 开始的数组 stock 和 cost ,请你在预算不超过 budget 金钱的前提下,最大化 公司制造合金的数量。

所有合金都需要由同一台机器制造。

返回公司可以制造的最大合金数。

解题思路

我们需要找出一个最大的数满足当前费用小于预算,因为预算最大是10000000,库存最大10000000,且价格是大于1的所以我们能取到的最大数量是200000000(这里我整了好久,因为一开始没有算上库存只算了价格的100000000,导致有一个用例一直没过去)。 最简单的方式就是我们可以遍历1~200000000,找出最大的数满足费用不大于预算。 但是我们可以注意到,我们其实是在一个升序序列中查找,可以通过二分法来优化。

代码实现

java实现

main函数里面的用例就是那个没过去的用例,哈哈哈哈。

java 复制代码
public class Solution {
    public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {
        int max = 0;
        int left = 0;
        int right = 200000000;
        while (left <= right){
            // 是否有满足预算的机器
            boolean flag = false;
            int mid = left + (right - left) / 2;
            for(int i = 0; i < k; i++) {
                // 计算总价
                long currentCost = 0;
                for (int j = 0; j < n; j++) {
                    currentCost +=  (Math.max((long)composition.get(i).get(j) * mid - stock.get(j), 0)) * cost.get(j);
                }
                // 总价低于预算,可以继续加
                if (currentCost <= budget) {
                    max = Math.max(mid, max);
                    flag = true;
                }
            }
            // 可以加
            if (flag) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        return max;
    }

    public static void main(String[] args) {
        int n = 1, k = 1, budget = 100000000;
        List<List<Integer>> composition = new ArrayList<>();
        composition.add(Arrays.asList(1));

        List<Integer> stock = Arrays.asList(83358995), cost = Arrays.asList(1);
        System.out.println(new Solution().maxNumberOfAlloys(n,k,budget,composition,stock,cost));
    }
}

c++实现

cpp 复制代码
class Solution {

public:
    int maxNumberOfAlloys(int n, int k, int budget, vector<vector<int>>& composition, vector<int>& stock, vector<int>& cost) {
        int max = 0;
        int left = 0;
        int right = 200000000;
        while (left <= right) {
            bool flag = false;
            int mid = left + (right - left) / 2;
            for (int i = 0; i < k; i++) {
                // 计算总价
                long currentCost = 0;
                for (int j = 0; j < n; j++) {
                    long buyCost = (long)composition[i][j] * mid - stock[j];
                    currentCost +=  (buyCost> 0 ? buyCost : 0) * cost[j];
                }
                // 总价低于预算,可以继续加
                if (currentCost <= budget) {
                    max = max > mid ? max : mid;
                    flag = true;
                }
            }
            // 可以加
            if (flag) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        return max;
    }
};
相关推荐
学代码的CJY7 分钟前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
小溪学编程27 分钟前
从 C++ 的规范变迁看语言发展
jvm·c++·面试
白帽攻防录28 分钟前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
谢亮_vipxieliang1 小时前
Stream API 不是银弹:常见坑与性能建议
java·开发语言
小O的算法实验室1 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
源码宝1 小时前
Web‑PACS 云影像源码|Java+Vue3 医院影像管理系统完整方案
java·源码·影像pacs·成品源码·医院影像系统
ShineWinsu1 小时前
对于Redis:string类型的解析
java·c++·redis·分布式·缓存·面试·string
可乐ea2 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测
上位机妹子2 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
心中有你02142 小时前
【路径规划】A*寻路算法最通俗易懂讲解(C语言完整实现+详细注释)
c语言·开发语言·算法