示例 1:
输入:n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
输出:60
解释:
我们选择工程师 2(speed=10 且 efficiency=4)和工程师 5(speed=5 且 efficiency=7)。他们的团队表现值为 performance = (10 + 5) * min(4, 7) = 60 。
示例 2:
输入:n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
输出:68
解释:
此示例与第一个示例相同,除了 k = 3 。我们可以选择工程师 1 ,工程师 2 和工程师 5 得到最大的团队表现值。表现值为 performance = (2 + 10 + 5) * min(5, 4, 7) = 68 。
示例 3:
输入:n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
输出:72
提示:
1 <= n <= 10^5
speed.length == n
efficiency.length == n
1 <= speed[i] <= 10^5
1 <= efficiency[i] <= 10^8
1 <= k <= n
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-performance-of-a-team
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
对 speed 和 efficiency 同步排序,按照效率降序
遍历,对每一项数据
1. 累加和 sum ,当超过 k 个的数据时,选最小的将其排除
2. 使用优先队列来找到 k 个中最小的数据
3. 效率的最低值就是当前项的效率
4. 计算结果,注意这里不能取余
返回最终结果时取余
作者:ikaruga
链接:https://leetcode-cn.com/problems/maximum-performance-of-a-team/solution/5359-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
struct node{
long long s,e;
} en[100000000+50];
const int MOD = 1e9+7;
class Solution {
public:
int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
for(int i = 0;i<n;i++){
en[i].s = speed[i];
en[i].e = efficiency[i];
}
sort(en,en+n,[](node a,node b){
return a.e>b.e;
});
for(int i = 0;i<n;i++){
cout<<en[i].s<<" "<<en[i].e<<endl;
}
priority_queue<long long, vector<long long >, greater<long long > > q;
while(!q.empty()) q.pop();
long long sum = 0;
long long ret = 0;
for(int i = 0;i<n;i++){
sum+=en[i].s;
q.push(en[i].s);
while(q.size()>k){
sum-=q.top();
q.pop();
}
ret = max(ret,sum*en[i].e);
}
return ret%MOD ;
}
};