Hard
There are n
workers. You are given two integer arrays quality
and wage
where quality[i]
is the quality of the ith
worker and wage[i]
is the minimum wage expectation for the ith
worker.
We want to hire exactly k
workers to form a paid group. To hire a group of k
workers, we must pay them according to the following rules:
Given the integer k
, return the least amount of money needed to form a paid group satisfying the above conditions. Answers within 10-5
of the actual answer will be accepted.
Example 1:
Input: quality = [10,20,5], wage = [70,50,30], k = 2
Output: 105.00000
Explanation: We pay 70 to 0th worker and 35 to 2nd worker.
Example 2:
Input: quality = [3,1,10,10,1], wage = [4,8,2,2,7], k = 3
Output: 30.66667
Explanation: We pay 4 to 0th worker, 13.33333 to 2nd and 3rd workers separately.
Constraints:
n == quality.length == wage.length
1 <= k <= n <= 104
1 <= quality[i], wage[i] <= 104
import java.util.PriorityQueue
class Solution {
fun mincostToHireWorkers(quality: IntArray, wage: IntArray, k: Int): Double {
val n = quality.size
val workers = arrayOfNulls<Worker>(n)
for (i in 0 until n) {
workers[i] = Worker(wage[i], quality[i])
}
workers.sortBy { it!!.ratio() }
val maxHeap = PriorityQueue { a: Int, b: Int ->
b.compareTo(a)
}
var sumQuality = 0
var result = Double.MAX_VALUE
for (i in 0 until n) {
val worker = workers[i]
sumQuality += worker!!.quality
maxHeap.add(worker.quality)
if (maxHeap.size > k) {
sumQuality -= maxHeap.remove()!!
}
val groupRatio = worker.ratio()
if (maxHeap.size == k) {
result = Math.min(sumQuality * groupRatio, result)
}
}
return result
}
internal class Worker(var wage: Int, var quality: Int) {
fun ratio(): Double {
return wage.toDouble() / quality
}
}
}