题解
贪心 排序 堆 优先队列
只要每次选取的时候保证 w >= 投资资本 选取符合要求的利润最大的即可
先按投资资本从小到大排序
每次在符合 w >= 投资资本 选取profits最大的那个
如果两个for循坏 直接超时
这个时候需要没有学习过的大顶堆 把符合要求 w >= 投资资本 的项目利润都放进堆 取堆顶就是每次取的最大利润 维护这个大顶堆 就不需要两个for循坏了
大顶堆可以用优先队列来实现
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
代码
class Solution {
public:
int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {
int n = profits.size();
vector<pair<int, int>> pairs;
for(int i=0; i<n; i++) {
pairs.push_back({capital[i], profits[i]});
}
sort(pairs.begin(), pairs.end());
priority_queue<int, vector<int>, less<int>> que;
int index = 0;
for(int i=0; i<k; i++) {
while(index < n && pairs[index].first<=w) {
que.push(pairs[index].second);
index++;
}
if(!que.empty()) {
w += que.top();
que.pop();
} else {
break;
}
}
return w;
}
};