第九周 Leetcode 502. IPO (HARD)

Leetcode 502

一个公司 目前有资产W 可以选择实现K个项目,每个项目要求公司当前有一定的资产,且每个项目可以使公司的总资产增加一个非负数。

项目数50000

设计一个优先队列,对于当前状态,队列中存放所有需要资产小于等于当前W的项目,队头为利润最大的项目,每次选择一个项目后,由于资产可能增加,尝试向队列中增加新的项目。

复杂度O(nlogn)

代码很简单。

struct sub
{
 int pro;int cap;
};
struct cmp2
{
 bool operator ()(const sub &a,const sub &b)
 {
 return a.pro<b.pro;
 }
};
vector<sub>ss;
bool cmp1(sub a,sub b)
{
 return a.cap<b.cap;
}
priority_queue<sub,vector<sub>,cmp2>q;
class Solution {
public:
    int findMaximizedCapital(int k, int W, vector<int>& Profits, vector<int>& Capital) {
        ss.resize(Profits.size());
        while(!q.empty())q.pop();
        for(int i=0;i<Profits.size();i++)
        {
		
        	ss[i].pro=Profits[i];ss[i].cap=Capital[i];
        }
        sort(&ss[0],&ss[0]+(int)ss.size(),cmp1);
     int i=0;
     bool flag=true;
     while(flag&&k>0)
     {
	 flag=false;
     while(i<ss.size()&&ss[i].cap<=W)
     	{
		 q.push(ss[i]);i++;
		}
     if((!q.empty())&&q.top().pro>0){flag=true;W+=q.top().pro;q.pop();k--;}
    }
     return W;
    }
};

  

原文地址:https://www.cnblogs.com/heisenberg-/p/6735388.html