502. IPO

题目

假设 LeetCode 即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 LeetCode 设计完成最多 k 个不同项目后得到最大总资本的方式。

给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。最初,你有 W 资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。

总而言之,从给定项目中选择最多 k 个不同项目的列表,以最大化最终资本,并输出最终可获得的最多资本。

示例 1:

输入: k=2, W=0, Profits=[1,2,3], Capital=[0,1,1].

输出: 4

解释:
由于你的初始资本为 0,你尽可以从 0 号项目开始。
在完成后,你将获得 1 的利润,你的总资本将变为 1。
此时你可以选择开始 1 号或 2 号项目。
由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。
因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。

思路

对于这个题,首先想到的贪心策略就是每一次做项目,都是在能做的项目中找利润最高的。
但对于具体如何实现,参考了一些别人的博客,主要是用一条优先队列存储能做的项目,一个数组按capital从小到大排序后进行遍历。每做一个项目之前,都先寻找所有能做的项目后,再在优先队列里找一个利润最大的项目(队头)。
这里注意由于W是越来越大的,因此寻找能做的项目时,直接从上次找过的地方开始继续遍历数组即可,同时优先队列也不需要每次都重新构造一次。

代码

struct project{
    int profit;
    int capital;
    project(int profit , int capital){
        this->profit = profit;
        this->capital = capital;
    }
    friend bool operator< (const project& a ,const project& b){
        return a.profit < b.profit;
    }

};
class Solution {
public:
    static bool cmpCapital(project& a , project& b){
        return a.capital < b.capital;
    }

    int findMaximizedCapital(int k, int W, vector<int>& Profits, vector<int>& Capital) {
        vector<project> projectVec;
        priority_queue<project> profitPq;
        int nowCapStart = 0;
        for(int loop = 0 ; loop < Profits.size() ; loop ++){
            projectVec.push_back(project(Profits[loop] , Capital[loop] ) );
        }

        sort(projectVec.begin() , projectVec.end() , cmpCapital);
        for(int loop = 0 ; loop < k ; loop++){
            for( ; nowCapStart < projectVec.size() ; nowCapStart++ ){
                if(projectVec[nowCapStart].capital <= W){
                    profitPq.push(project( projectVec[nowCapStart] ) );
                }
                else{
                    break;
                }
            }
            if(!profitPq.empty()){
                W += profitPq.top().profit;
                profitPq.pop();
            }

        }
        return W;
    }
};

猜你喜欢

转载自blog.csdn.net/DDghsot/article/details/83348761
0条评论
添加一条新回复