这道题必须记录一下,写的好难受。
首先,题目并没有说用过的项目不能再用;
其次并不清楚为什么不能用数组来处理,提示我超时了,这里对于堆排序的复杂度问题我又有了新的疑问,比如之前我得到的知识一直是log1+log2+…+logn的时间复杂度是O(N),结果谷歌后发现这个时间复杂度是nlogn,那么建堆的过程为什么不能理解成log1+log2+…+logn而非是O(N)呢?现在还不知道,暂时放一下;
最后,我在把数据从收益大根堆拿出来后,堆中其它数据还要不要处理?我之前把这些数据又放回了成本小根堆,超时了。其实w的值是一直上涨的,所以原来收益大根堆中存放的项目在后续也一定可用。
struct money{
public:
int profits;
int capital;
money(int _profits, int _capital):profits(_profits),capital(_capital){};
};
struct cmp_profits
{
public:
bool operator()(money a, money b)
{return a.profits<b.profits;}
};
struct cmp_capital
{
public:
bool operator()(money a ,money b)
{return a.capital>b.capital;}
};
int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
priority_queue<money,vector<money>,cmp_profits>prof;///<利润堆
priority_queue<money,vector<money>,cmp_capital>cap;///<成本小根堆
for(size_t i=0;i<profits.size();++i)
{
money x = money(profits[i], capital[i]);
cap.push(x);
}
for(int i=0;i<k;++i)
{
while(!cap.empty() && cap.top().capital<=w)
{
prof.push(cap.top());
cap.pop();
}
if(!prof.empty())
{
w+=prof.top().profits;
prof.pop();
}
}
return w;
}