力扣算法篇:IPO(首次公开募股)

在这里插入图片描述
题解:每次选最大 超时

class Solution {
public:
    int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
        //n个项目中选k个使得资本最大化 每次在w>=capital[i]中选择纯利润最大的 
        int n = capital.size();
        //用一个数组标志该项目是否选过
        vector<int> flag(n,0);
        int maxprofit;
        int maxNum;
        for(int x = 1;x<=k;x++){
            //每次选择都需要考虑到无法投资的情况
            maxNum = -1;
            maxprofit = -1;
            for(int i = 0;i<n;i++){
                //该项目未选 并且可以投资 利益最大
                if(flag[i]==0 && w>=capital[i]&&profits[i]>maxprofit){
                    maxprofit = profits[i];
                    maxNum = i;
                }
            }
            //出来的时候就是利润最大的项目 更改w和flag 注意避开资本在剩余项目中一个项目都无法投资的情况
            if(maxNum!=-1){
                w+=profits[maxNum];
                flag[maxNum] = 1;
            }else{
                //没有可选项目了 退出
                break;
            }
        }
        return w;
    }
};

更改:
先将项目根据投资资本排序,然后使用优先队列(纯利润降序队列)选择最大利润
优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

class Solution {
public:
    int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
        //n个项目中选k个使得资本最大化 每次在w>=capital[i]中选择纯利润最大的 
        int n = profits.size();
        //项目id数组
        vector<int> id(n,0);
        for(int i = 0;i<n;i++){
            id[i] = i;
        }
        //id数组根据投资资本排序 递增序列
        sort(id.begin(),id.end(),[&](int a,int b){
            return capital[a]<capital[b];
        });
        //优先队列 降序队列 大顶堆
        priority_queue<int,vector<int>,less<int>> q;
        int j = 0;
        //外循环遍历k次选取项目
        for(int i = 0;i<k;i++){
            //选择投资资本低于w的项目加入优先队列
            for(;j<n&&capital[id[j]]<=w;j++){
                q.push(profits[id[j]]);
            }
            //队列为空则说明无项目可选
            if(q.empty()){
                break;
            }
            //否则 选中队头项目(纯利润最大) 更改w
            w+=q.top();
            q.pop();
        }
        return w;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值