|
1 | 1 | class Solution {
|
2 |
| - public double mincostToHireWorkers(int[] quality, int[] wage, int k) { |
3 |
| - double ans = Double.MAX_VALUE; |
4 |
| - int qualitySum = 0; |
5 |
| - // (wagePerQuality, quality) sorted by wagePerQuality |
6 |
| - Pair<Double, Integer>[] workers = new Pair[quality.length]; |
7 |
| - Queue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); |
8 |
| - |
9 |
| - for (int i = 0; i < quality.length; ++i) |
10 |
| - workers[i] = new Pair<>((double) wage[i] / quality[i], quality[i]); |
11 |
| - |
12 |
| - Arrays.sort(workers, (a, b) -> Double.compare(a.getKey(), b.getKey())); |
13 |
| - |
14 |
| - for (Pair<Double, Integer> worker : workers) { |
15 |
| - final double wagePerQuality = worker.getKey(); |
16 |
| - final int q = worker.getValue(); |
17 |
| - maxHeap.offer(q); |
18 |
| - qualitySum += q; |
19 |
| - if (maxHeap.size() > k) |
20 |
| - qualitySum -= maxHeap.poll(); |
21 |
| - if (maxHeap.size() == k) |
22 |
| - ans = Math.min(ans, qualitySum * wagePerQuality); |
| 2 | + public double mincostToHireWorkers(int[] quality, int[] wage, int k) { |
| 3 | + int n = quality.length; |
| 4 | + Pair<Double, Integer>[] t = new Pair[n]; |
| 5 | + for (int i = 0; i < n; ++i) { |
| 6 | + t[i] = new Pair<>((double) wage[i] / quality[i], quality[i]); |
| 7 | + } |
| 8 | + Arrays.sort(t, (a, b) -> Double.compare(a.getKey(), b.getKey())); |
| 9 | + PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a); |
| 10 | + double ans = 1e18; |
| 11 | + int tot = 0; |
| 12 | + for (var e : t) { |
| 13 | + tot += e.getValue(); |
| 14 | + pq.offer(e.getValue()); |
| 15 | + if (pq.size() == k) { |
| 16 | + ans = Math.min(ans, tot * e.getKey()); |
| 17 | + tot -= pq.poll(); |
| 18 | + } |
| 19 | + } |
| 20 | + return ans; |
23 | 21 | }
|
24 |
| - |
25 |
| - return ans; |
26 |
| - } |
27 | 22 | }
|
0 commit comments