问题描述
小明的蛋糕工厂每天可以生产的蛋糕数量是由工厂中的机器和工人的数量决定的,即 ( m \times w )。现在他收到了一个大订单,需要尽快生产出 ( n ) 个蛋糕。为了提升生产速度,小明可以使用每天生产的蛋糕去购买额外的机器或工人,每台机器或每个工人的成本是 ( p ) 个蛋糕。
例如,如果工厂起始时有 1 台机器和 2 个工人,每次扩大产能的成本是 1 个蛋糕,为了生产 60 个蛋糕,小明可以这样操作:
- 第一天:生产 2 个蛋糕,买入 2 台机器(总机器数变为 3)。
- 第二天:生产 6 个蛋糕,买入 3 台机器,3 个工人(机器数 6,工人数 5)。
- 第三天:生产 30 个蛋糕。
- 第四天:再生产 30 个蛋糕,完成订单。
你的任务是帮助小明计算最快多少天能完成订单。
代码
def solution(m, w, p, n):
# Please write your code here
passes = 0
candy = 0
run = float('inf')
while candy < n:
if m > float('inf') / w:
step = 0
else:
step = (p - candy) // (m * w)
if step <= 0:
mw = candy // p
if m >= w + mw:
w += mw
elif w >= m + mw:
m += mw
else:
total = m + w + mw
m = total // 2
w = total - m
candy %= p
step = 1
passes += step
if step * m > float('inf') / w:
candy = float('inf')
else:
candy += step * m * w
run = min(run, passes + ((n - candy + m * w - 1) // (m * w)))
return min(passes, run)
if __name__ == "__main__":
# You can add more test cases here
print(solution(3, 1, 2, 12) == 3 )
print(solution(10, 5, 30, 500) == 8 )
print(solution(3, 5, 30, 320) == 14 )