budget cuts

🏠
 1"""
 2time: O(log b * |G|)
 3space: O(1)
 4"""
 5
 6def find_grants_cap(G, b):
 7  comp_total = lambda c: sum(min(c, g) for g in G)
 8  l, r = 0, b
 9  while l < r:
10    m = (l + r) / 2
11    total = comp_total(m)
12    if abs(total - b) < 0.0001:
13      return m
14    else:
15      l, r = ((m, r),(l, m))[total > b]
16
17print(find_grants_cap([2, 100, 50, 120, 1000], 190))