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;
    }
};
posted @ 2020-03-15 17:29  xyee  阅读(217)  评论(0编辑  收藏  举报