-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathminimum-cost-to-hire-k-workers.py
88 lines (64 loc) · 2.44 KB
/
minimum-cost-to-hire-k-workers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import heapq
from typing import List, Tuple
from functools import lru_cache
class Worker:
def __init__(self, wage: float, quality: float) -> None:
self.wage = wage
self.quality = quality
self.ratio = wage / quality
class Solution:
def mincostToHireWorkers(
self, quality: List[int], wage: List[int], K: int
) -> float:
workers = [Worker(w, q) for w, q in zip(wage, quality)]
workers.sort(key=lambda w: w.ratio)
cost = float("+inf")
total_quality = 0
heap = []
for worker in workers:
heapq.heappush(heap, -worker.quality)
total_quality += worker.quality
if len(heap) > K:
total_quality -= -heapq.heappop(heap)
if len(heap) == K:
cost = min(cost, total_quality * worker.ratio)
return cost
def mincostToHireWorkersBruteForceDFS(
self, quality: List[int], wage: List[int], K: int
) -> float:
@lru_cache(None)
def dfs(worker: int, left: int, ratio: float, prev: float) -> float:
if left == 0:
return prev
if worker == len(quality):
return float("+inf")
cur_wage = max(quality[worker] * ratio, wage[worker])
cur_ratio = cur_wage / quality[worker]
total_wage = prev * cur_ratio / ratio + cur_wage
return min(
dfs(worker + 1, left, ratio, prev),
dfs(worker + 1, left - 1, cur_ratio, total_wage),
)
return dfs(0, K, 0.000001, 0)
def mincostToHireWorkersBruteForceDijkstra(
self, quality: List[int], wage: List[int], K: int
) -> float:
wage_quality = list(
reversed(
sorted(((w, q) for w, q in zip(wage, quality)), key=lambda x: (x[0] / x[1]))
)
)
heap = []
heapq.heappush(heap, (0, K, 0, 0))
while heap:
prev_wage, left, ratio, worker = heapq.heappop(heap)
if left == 0:
return prev_wage
if worker == len(quality):
continue
heapq.heappush(heap, (prev_wage, left, ratio, worker + 1))
cur_wage, cur_quality = wage_quality[worker]
ratio = max(ratio, cur_wage / cur_quality)
new_wage = prev_wage + cur_quality * ratio
heapq.heappush(heap, (new_wage, left - 1, ratio, worker + 1))
return -1.0