【LeetCode】每日一题 2024_1_27 最大合金数(二分)

文章目录

LeetCode?启动!!!

今天的题目做起来真是难受,不像昨天的,5 秒钟就写完了

题目:最大合金数

题目链接:2861. 最大合金数

题目描述

代码与解题思路

go 复制代码
func maxNumberOfAlloys(n int, k int, budget int, composition [][]int, stock []int, cost []int) int {
    check := func (target int) bool { // target 是我们想要制造的合金数量
        for _, machine_i := range composition { // 选择使用第 i 台机器
            remain := budget // 预算
            for i, v := range machine_i { // v 是制造该合金需要该类金属的数量
                need := max(0, v*target-stock[i]) // 需要购买 i 类金属的数量, (该数不能小于 0)
                remain -= need*cost[i] // 买这些金属需要花的钱
            }
            if remain >= 0 {
                return true
            }
        }
        return false
    }

    l, r := 0, int(2e8)
    for l < r {
        mid := (l+r+1)>>1
        if check(mid) { // mid 作为想要制造和合金数, 如果符合, 就让 l = mid, l 即为答案
            l = mid
        } else {
            r = mid-1
        }
    }
    return l
}

今天的题目一句话总结就是,看题一小时,写代码 15 分钟

看了半天没看懂题目到底在说些什么东西,三个样例看了老半天才搞明白他的意思,说人话就是:

题目解析

composition 这个二维数组,有 i 行,每一行是一种机器,你可以在 i 种机器中选择一台,而每个代表机器的数组,他的元素表示的是这个机器冶炼合金需要的各类金属的比例搭配

cost 数组是各类金属对应的价格,stock 是题目给的现有的金属数量,n 是金属种类数,k 他给你提供的机器种类数量,budget 是你拥有的预算,在他给定的预算下,求出你能制造的最多的合金数量

解题思路

说人话就是从这些机器里面选一个最合适的冶炼合金的搭配

假设给出需要制造的合金数量,我们能判断当前预算能否成功制造,那如何快速找到合适的,最大的合金数量呢?

模拟

假设我们打算制造 10 个合金,发现无论使用哪台机器,预算都不够用,那我们就能让 10 个合金作为我们的右边界,超过 10 台合金的情况全部排除

如果我们打算制造 5 个合金,计算发现预算充足,那最大能制造和合金数量可能就是 5,也可能更多,我们的区间就变成了 5 ~ 9

分析到这里,我们就能发现他的二段性和单调性了,也该想到,用二分来快速找出合适的合金数量了

注意

题目非常坑爹,说好的数据范围是 0 ~ 1e8,实际上数据出的是 0 ~ 2e8,导致我一开始提交错了,想了两分钟到底出了什么问题

相关推荐
漫随流水6 分钟前
leetcode算法(513.找树左下角的值)
数据结构·算法·leetcode·二叉树
翔云12345616 分钟前
2025年度总结
程序人生·职场和发展
tod11340 分钟前
从零手写一个面试级 C++ vector:内存模型、拷贝语义与扩容策略全解析
c++·面试·职场和发展·stl·vector
囊中之锥.41 分钟前
机器学习算法详解:DBSCAN 聚类原理、实现流程与优缺点分析
算法·机器学习·聚类
AlenTech1 小时前
152. 乘积最大子数组 - 力扣(LeetCode)
算法·leetcode·职场和发展
Piar1231sdafa1 小时前
基于yolo13-C3k2-RVB的洗手步骤识别与检测系统实现_1
人工智能·算法·目标跟踪
a程序小傲1 小时前
中国邮政Java面试被问:Netty的FastThreadLocal优化原理
java·服务器·开发语言·面试·职场和发展·github·哈希算法
做科研的周师兄1 小时前
【MATLAB 实战】|多波段栅格数据提取部分波段均值——批量处理(NoData 修正 + 地理信息保真)_后附完整代码
前端·算法·机器学习·matlab·均值算法·分类·数据挖掘
天赐学c语言1 小时前
1.18 - 滑动窗口最大值 && 子类的指针转换为父类的指针,指针的值是否会改变
数据结构·c++·算法·leecode
甄心爱学习2 小时前
KMP算法(小白理解)
开发语言·python·算法