题目
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。
如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。
请你计算 最多 能喝到多少瓶酒。
示例 1:
输入:numBottles = 9, numExchange = 3
输出:13
解释:你可以用 3 个空酒瓶兑换 1 瓶酒。
所以最多能喝到 9 + 3 + 1 = 13 瓶酒。
示例 2:
输入:numBottles = 15, numExchange = 4
输出:19
解释:你可以用 4 个空酒瓶兑换 1 瓶酒。
所以最多能喝到 15 + 3 + 1 = 19 瓶酒。
示例 3:
输入:numBottles = 5, numExchange = 5
输出:6
示例 4:
输入:numBottles = 2, numExchange = 3
输出:2
提示:
1 <= numBottles <= 100
2 <= numExchange <= 100
来源:力扣(LeetCode)
解题思路
对于这类集卡换物的问题,我们可以定义一次操作为用整数倍的酒换取一定量的酒,剩下的酒和换取的酒再做一次操作,循环往复,直到最后换不了酒了,那么最后剩下的酒加上前面所有整数倍的酒就是总酒量。例如:示例2,一开始有15瓶,我们先喝上12瓶剩下的3瓶和换取的3瓶一共是6瓶,在这6瓶里,我们再喝上它4瓶,剩下的1瓶和换取的1瓶最后喝。
class Solution:
def numWaterBottles(self, numBottles: int, numExchange: int) -> int:
s=0
while numBottles>=numExchange:
a,b=divmod(numBottles,numExchange) #a为能换取的瓶数,b为余下的瓶数是要放到下一次一起兑换的
s+=a*numExchange #喝上整数倍的瓶数
numBottles=a+b #余下的瓶和换取的瓶数作为下一次操作的开端
return s+numBottles #最后换不了一瓶的瓶和整数倍的瓶加起来