效率有点低, 后面再想一下
* @param {number} n
* @param {number[]} speed
* @param {number[]} efficiency
* @param {number} k
* @return {number}
* 暴力循环, 以每个人的效率作为最低效率,另外选取最多k - 1个速度最大的人,加上被选中的那个人共k个人作为总的被选中的人,其中表现值最大的就是答案
* 时间复杂度O(nlog(k - 1))
*/
// 因为中间要比大小, 所以无法对中间值求余, 那么数值必然会超过2 ** 53,只能用BigInt了
const mod = BigInt(10 ** 9 + 7)
var maxPerformance = function(n, speed, efficiency, k) {
const pairs = speed.map((v, k) => [v, efficiency[k]])
pairs.sort((a, b) => b[1] - a[1])
let sum = 0
let ans = 0n
const queue = []
const limit = k - 1
for(let x of pairs) {
if(queue.length > limit) {
const temp = queue.pop()
sum -= temp
}
let tempAns = BigInt(x[0] + sum) * BigInt(x[1])
if(tempAns > ans) ans = tempAns
insert(queue, x[0])
sum = sum + x[0]
}
return ans % mod
};
// js没有优先队列, 只能自己用二分查找方法模拟一个优先队列
function insert(arr, e) {
let l = 0
let r = arr.length
let m = undefined
while(l <= r) {
m = ((l + r) / 2) | 0
if(e < arr[m]) {
l = m + 1
} else if(e > arr[m]) {
r = m - 1
} else {
l = m
break
}
}
// 如果e不存在于数组arr中,那么找到的l是小于e的数的位置上
// 如果e存在于数组中, 那就是等于e的数的位置上
// 主要注意, splice会把原来位置的数往后挤,而不是把e放到原来数下一个位置
if(arr[l] >= e) {
arr.splice(l + 1, 0, e)
} else arr.splice(l, 0, e)
}```