Last active
September 23, 2023 23:36
-
-
Save bakar-io/f8f59cbb52515c86e3e947fc91731073 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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