LeetCode 1383. 最大的团队表现值

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);
    }
    
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值