leetcode 1383. Maximum Performance of a Team(团队的最大performance)

给定n个工程师的速度和效率数组,最多选择k个工程师,性能由速度之和乘以效率中的最小值决定。为找到最大性能,文章提出将数据按效率降序排序,使用最小堆来动态调整选择的工程师,并在每次变更后计算性能,最后对结果取模。算法在每次添加或移除工程师时更新性能总和并维护堆的大小不超过k。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

n个工程师,长度为n的speed数组和efficiency数组。
每次最多选k个工程师,取出k个对应的speed和efficiency数字。
performance=sum(k个speed) ✖ min(k个efficiency)
可以理解为k个人一起干,效率按最慢的人算(一个环节干不完其他人都要等)。
求最大的performance,结果对109+7取模。

思路:

2542题类似,
区别在于2542题不需要取mod,且固定是k个,本题是最多选k个。

因为受限于最小的efficiency, 所以把speed和efficiency的元素组对,按efficiency降序排序。
那么每次取出的是较大的efficiency, 同时也是对问题降维。
当选出的人数>k时,只需把较小的speed去掉即可, 这就需要用到最小堆。

每加一个,或者去掉一个工程师,都要更新sum.

由于不再是固定size为k, 所以每取一个组合,就要计算一次performance。

    public int maxPerformance(int n, int[] speed, int[] efficiency, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(k);
        long sum = 0;
        long res = 0;
        final int MOD = 1000000007;
        int[][] SEs = new int[n][2];
        for(int i = 0; i < n; i++) {
            SEs[i] = new int[]{speed[i], efficiency[i]};
        }

        Arrays.sort(SEs, (a,b)->(b[1] - a[1]));

        for(int i = 0; i < n; i++) {
            if(pq.size() >= k) sum -= pq.poll();
            sum += SEs[i][0];
            pq.offer(SEs[i][0]);
            
            res = Math.max(res, (sum * SEs[i][1]));
        }
        return (int)(res%MOD);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值