首页 > 其他分享 >100033. 最大合金数-363

100033. 最大合金数-363

时间:2023-09-17 21:36:19浏览次数:43  
标签:cost int 合金 budget composition 100033 363 stock

100033. 最大合金数

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

对于第 i 台机器而言,创建合金需要 composition[i][j] 份 j 类型金属。最初,你拥有 stock[i] 份 i 类型金属,而每购入一份 i 类型金属需要花费 cost[i] 的金钱。

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

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

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

示例 1:

输入:n = 3, k = 2, budget = 15, composition = [[1,1,1],[1,1,10]], stock = [0,0,0], cost = [1,2,3]
输出:2
解释:最优的方法是使用第 1 台机器来制造合金。
要想制造 2 份合金,我们需要购买:

  • 2 份第 1 类金属。
  • 2 份第 2 类金属。
  • 2 份第 3 类金属。
    总共需要 2 * 1 + 2 * 2 + 2 * 3 = 12 的金钱,小于等于预算 15 。
    注意,我们最开始时候没有任何一类金属,所以必须买齐所有需要的金属。
    可以证明在示例条件下最多可以制造 2 份合金。
    示例 2:

输入:n = 3, k = 2, budget = 15, composition = [[1,1,1],[1,1,10]], stock = [0,0,100], cost = [1,2,3]
输出:5
解释:最优的方法是使用第 2 台机器来制造合金。
要想制造 5 份合金,我们需要购买:

  • 5 份第 1 类金属。
  • 5 份第 2 类金属。
  • 0 份第 3 类金属。
    总共需要 5 * 1 + 5 * 2 + 0 * 3 = 15 的金钱,小于等于预算 15 。
    可以证明在示例条件下最多可以制造 5 份合金。
    示例 3:

输入:n = 2, k = 3, budget = 10, composition = [[2,1],[1,2],[1,1]], stock = [1,1], cost = [5,5]
输出:2
解释:最优的方法是使用第 3 台机器来制造合金。
要想制造 2 份合金,我们需要购买:

  • 1 份第 1 类金属。
  • 1 份第 2 类金属。
    总共需要 1 * 5 + 1 * 5 = 10 的金钱,小于等于预算 10 。
    可以证明在示例条件下最多可以制造 2 份合金。

提示:

\[1 <= n, k <= 100\\ 0 <= budget <= 10^8\\ composition.length == k\\ composition[i].length == n\\ 1 <= composition[i][j] <= 100\\ stock.length == cost.length == n\\ 0 <= stock[i] <= 10^8\\ 1 <= cost[i] <= 100\\ \]

解题思路

见代码注释。其实二分答案和二分查找是一样的,就是能不能看出来是二分答案。

code

typedef long long int LL;

class Solution {
public:

    //二分答案
    //k个子问题:每个机器可以制造合金的数目
    //关键是如何计算每个机器制造合金的数目
    //一开始以为是数学问题
    //结果实在是算不懂啊
    //需要考虑的参数太多
    //需要花费的材料:composition
    //现有的材料:stock
    //需要的花费:cost
    //预算:budget
    //算不明白捏
    //暴力?num = 0,1,2,....
    //从暴力可以得出二分答案的解法
    //下界:0
    //上界:花费最少cost=1,消耗最少composition=1,min(stock) + budget / n

    //制造num,钱小于等于budget
    //制造num,钱大于budget
    //二分左区间的右端点
    bool check(vector<int> & composition,vector<int>& stock,vector<int>& cost,int &num,int & budget)
    {
        LL money = 0;
        int n = composition.size();
        for(int i = 0;i < n;i ++)
        {
            if(stock[i] < (LL)composition[i] * (LL)num) money += ((LL)composition[i] * (LL)num - stock[i]) * cost[i];
            if(money > budget) return false;
        }

        return true;
    }
    int maxNumberOfAlloys(int n, int k, int budget, vector<vector<int>>& composition, vector<int>& stock, vector<int>& cost) {
        
        int ans = 0;
        int min_e = *min_element(stock.begin(),stock.end());
        for(int i = 0;i < k;i ++)
        {
            int left = 0,right = min_e + budget + 1;
            while(left < right)
            {
                int mid = (left + right + 1) / 2;
                if(check(composition[i],stock,cost,mid,budget)) left = mid;
                else right = mid - 1;
            }

            ans = max(ans,left);
        }

        return ans;
    }
};

标签:cost,int,合金,budget,composition,100033,363,stock
From: https://www.cnblogs.com/huangxk23/p/17709854.html

相关文章

  • 100031. 计算 K 置位下标对应元素的和-363
    100031.计算K置位下标对应元素的和给你一个下标从0开始的整数数组nums和一个整数k。请你用整数形式返回nums中的特定元素之和,这些特定元素满足:其对应下标的二进制表示中恰存在k个置位。整数的二进制表示中的1就是这个整数的置位。例如,21的二进制表示为10......
  • AI「反腐」,德国马普所结合 NLP 和 DNN 开发抗蚀合金
    内容一览:在被不锈钢包围的世界中,我们可能都快忘记了腐蚀的存在。然而,腐蚀存在于生活中的方方面面。无论是锈迹斑斑的钢钉,老化漏液的电线,还是失去光泽的汽车,这一切的发生都与腐蚀有关。据统计,全世界每年由金属腐蚀带来的经济损失超过2.5万亿美元,远超过其他自然灾害。其中,腐蚀在中......
  • B3635 硬币问题
    B3635硬币问题方法一:搜索#include<bits/stdc++.h>usingnamespacestd;intm;intdfs(intn){//求凑够n元的最小硬币数 if(n<=4&&n>=1)returnn; if(n>=5&&n<=9)returnn-4; if(n>=10&&n<=11)return12-n; ret......
  • 【LuoGu 1363】幻象迷宫——深度优先搜索 + 读题
    幻象迷宫题目背景(喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫。)WD:呜呜,肿么办啊……LHX:momo...我们一定能走出去的!WD:嗯,+U+U!题目描述幻象迷宫可以认为是无限大的,不过它由若干个\(N\timesM\)的矩阵重复组成。矩阵中有的地......
  • uvalive 3363(区间dp)
    题意:给出一个字符串,问最多能缩减到多短。缩减方式比如:aaaaabbbb->5(a)4(b)nowletsgogogoletsgogogo->now2(lets3(go))题解:区间dp,f[l][r]表示从l到r最多缩减到的长度。#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;constintN=2......
  • 福昕Foxit PDF远程代码执行漏洞CVE-2023-27363分析与复现
    漏洞概述福建福昕软件开发股份有限公司是一家国际化运营的PDF电子文档解决方案提供厂商,提供文档的生成、转换、显示、编辑、搜索、打印、存储、签章、表单、保护、安全分发管理等涵盖文档生命周期的产品技术与解决方案。其下产品FoxitPDFReader和FoxitPDFEditor的javascript函......
  • 换个思路,简单很多——B3637 最长上升子序列
    题面:B3637最长上升子序列-洛谷|计算机科学教育新生态(luogu.com.cn)  可恶,搞了半天结果是很简单的一个题目  我一直在想目标序列的左右对称  即序列中每一个负数块的和都小于左右两侧任一部分的和后来看了几个题解,发现只要从一个方向扫一遍,就必定扫到最优解  将和......
  • 【每日一题】Problem 363B. Fence
    原题解决思路求k个木板的最小高度和,因为所有木板的高度和不超过1e9,因此计算出到当前木板j的总高度-前j-k模板的总高度并求得最小数即可#include<bits/stdc++.h>intmain(){intn,k;std::cin>>n>>k;std::vector<int>vec(n+1,0);for(in......
  • 30CrMnSiA军工钢、30CrMnSiA合金钢、30CrMnSiA化学成分
    一、30CrMnSiA钢板简介:30CrMnSiA钢板属于合金结构钢板,按照钢板内的碳含量区分可以称为中碳钢板。读作:三零铬锰硅A。厚度在6mm-150mm之间,以热轧状态交货,30CrMnSiA钢板屈服抗拉强度较高,切割变形小但不宜焊接,常用于切割零部件,由于其还具备抗疲劳性能,经过调质热处理可获得更高的强度。......
  • 钛合金先进成形与仿真实验室 西北工业大学 材料学院 博士
    子在川上曰,逝者如斯夫,不舍昼夜。自吾去蜀入秦,凡五年矣。昔之来者,翩翩素衣,白马银鞍,谈笑无忌。今将去也,堪堪而立,褐面黄须,肱股生腴。不得少瑜之梦笔,唯学祖狄而闻鸡。心高气傲以格钛二铝铌之物,智短才疏稍致材料加工之知。为此浅陋之文,以资博士之谋,诚不胜惶恐也。初入长安,即为恩师所知......