https://leetcode-cn.com/problems/maximum-performance-of-a-team/
一开始想的是dp,发现内存太大了,不太可能。
后来往排序预处理方面想,思路就来了,因为是 「所有工程师速度的和」乘以他们「效率值中的最小值」,所以只需要维护前面的前k个最大组成的和,用一个堆组成。最低的效率就是当前的,因为排过序了。如果不排序,就很难维护最低效率,因为前面的不时有因为速度不够大通过堆删去,那怎样找倒数第二的效率呢,很难。所以先按照效率由大到小排序,当前的就是效率最低的。
class Solution {
public:
struct Node{
int speed;
int efficiency;
};
Node nodes[100005];
static bool cmp(const Node &a,const Node &b){
if(a.efficiency!=b.efficiency){
return a.efficiency>b.efficiency;
}
return a.speed>b.speed;
}
int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
for(int i=0;i<n;i++){
nodes[i].speed=speed[i];
nodes[i].efficiency=efficiency[i];
}
sort(nodes,nodes+n,cmp);
priority_queue<int,vector<int>,greater<int> > q;
long long sum=0;
long long ans=0;
for(int i=0;i<n;i++){
q.push(nodes[i].speed);
sum+=nodes[i].speed;
if(q.size()>k){
int temp=q.top();
q.pop();
sum-=temp;
}
ans=max(ans,sum*nodes[i].efficiency);
}
return ans%(1000000000 + 7);
}
};