Skip to content

Instantly share code, notes, and snippets.

@bakar-io
Last active September 23, 2023 23:36
Show Gist options
  • Save bakar-io/f8f59cbb52515c86e3e947fc91731073 to your computer and use it in GitHub Desktop.
Save bakar-io/f8f59cbb52515c86e3e947fc91731073 to your computer and use it in GitHub Desktop.
import math
def solve(m: int, n: int, c2: float, c5: float) -> float:
"""
Adapter that costs c2, provides 2 ports but takes up 1 port, so net gain
is 1 port per adapter. Similarly, adapter that costs c5, provides 5 ports
but takes up 1 port, so net gain is 4 ports per adapter.
"""
devices, ports = m, n
assert ports > 0
assert devices >= 0
assert c2 >= 0
assert c5 >= 0
if ports >= devices:
return 0
delta = devices - ports
if c2 <= c5 / 4:
return delta * c2
if c5 <= c2:
return math.ceil(delta / 4) * c5
base = (delta // 4) * c5
remainder = delta % 4
return base + min(remainder * c2, c5)
def test():
# ports >= devices
assert solve(1, 1, 1, 1) == 0
assert solve(1, 2, 1, 1) == 0
# c2 <= c5 / 4
assert solve(10, 1, 0.25, 1) == 2.25
assert solve(10, 1, 0.20, 1) == 1.8
# c5 <= c2
assert solve(10, 1, 1, 1) == 3
assert solve(10, 1, 1, 0.9) == 2.7
# c5 more cost effective per port
assert solve(9, 1, 1, 2) == 4
assert solve(10, 1, 1, 2) == 5
assert solve(11, 1, 1, 2) == 6
assert solve(12, 1, 1, 2) == 6
if __name__ == "__main__":
test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment