一个公司 目前有资产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; } };