leetcode刷题之2861. 最大合金数

文章介绍了如何解决最大合金数问题,通过两种方法:一是常规模拟思路,可能导致超时;二是采用二分查找优化,通过检查库存和成本来确定机器能制造的最大零件数。作者强调了在自定义函数中使用引用以减少内存拷贝以提高性能。
摘要由CSDN通过智能技术生成

题目链接

2861.最大合金数

思路解析:

思路一

常规模拟思路,就是检查每个机器的能造的数量对其进行统计,找出最大的零件数量。但是会超时。

class Solution {
public:
    int maxNumberOfAlloys(int n, int k, int budget, vector<vector<int>>& composition, vector<int>& stock, vector<int>& cost) {
        int ans = 0;
        for(int i=0;i<k;i++){
            // int machine = i;
            int temp = 0;
            int temp_budget = budget;
            vector<int> temp_stock = stock;
            while(temp_budget>0){
                for(int j=0;j<temp_stock.size();j++){
                    if(temp_stock[j]-composition[i][j]<0){
                        temp_budget-=cost[j]*(composition[i][j]-temp_stock[j]);
                        temp_stock[j] = 0;
                    }else{
                        temp_stock[j]-=composition[i][j];
                    }
                }
                temp++;
            }
            if(temp_budget <0) temp--;
            cout<<temp<<" ";
            ans = max(temp, ans);
        }
        return ans;
    }
};

思路2

这题,对二分比较熟的就会知道,一眼二分,就是说对于某个机器,我看一下所拥有的条件是否能造出我给的零件,如果不能就开始分呗,对吧。常规思路。

class Solution {
public:
    int maxNumberOfAlloys(int n, int k, int budget, vector<vector<int>>& composition, vector<int>& stock, vector<int>& cost) {
        static long long  max_ = 1e9;
        int ans = 0;
        for(int i=0;i<k;i++){
            // int machine = i;
            int  left = 0; 
            int  right = max_;// 最大零件数
            while(left <= right){
                int mid = left+((right-left)>>1);
                // 询问mid的所属位置
                // 零件数量,消耗,预算,库存,开销
                if(check(mid, composition[i],budget, stock, cost)){
                    // 属于能造出的
                    left = mid+1;
                }else{
                    right = mid-1; // 属于造不出来的那一批;
                }
            }
            ans = max(ans, left-1);
        }
        return ans;
    }
    bool check(long long  mid, const vector<int >& comp, long long budget, const vector<int >&st, const vector<int >& cos){
        // 造mid所需的零件数量
        for(int i=0;i<comp.size();i++){
            long long  cur = static_cast<long long>(st[i]);
            long long cur2 = static_cast<long long >(comp[i]*mid);
            if(cur < cur2){
                budget-=(cur2-cur)*cos[i];
            }
            if(budget<0) return false;
        }
        return true;
    }
};

轻轻松松打败100%
注意:在自函数check里面的参数传递时候,尽量使用引用。否则巨大的数据拷贝量,将导致时间就上去了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值