5359. 最大的团队表现值
5359. 最大的团队表现值
这题是一道堆的好题,我们将speed和eff按照eff的降序排列,用当前的eff作为最小的eff乘以之前最大的speed和,虽然会和我们的意图不一致,但是这样不会影响答案。
还有一些解释写在注释里面了。
class Solution {
public:
int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
vector<vector<int>> v;
for (int i=0;i<n;i++) {
v.push_back({efficiency[i],speed[i]});
}
sort(v.rbegin(), v.rend());//逆序,降序
priority_queue<int,vector<int>,greater<int>> pq;
long long sum=0;
long long mod=1e9+7;
long long eff,ans=-1;
for (int i=0;i<n;i++) {
eff=v[i][0];
sum+=v[i][1];
pq.push(v[i][1]);
if (--k<0) {
sum-=pq.top();
pq.pop();
}
// printf("%d %d\n",v[i][0],v[i][1]);
// printf("%d %d\n",eff,sum);
//只有当前speed大于队列中某个speed时,当前较小的eff才可能更新答案
//对于speed不能大于的,用一个小的效率,乘以最大的队列和,也小于之前的答案
ans=max(ans,eff*sum);
}
return ans%mod;
}
};