(day12)

目录

🖍题目:

题目分析:

解题思路:

🌈递归解法:

🌈数学解法:

🖍题目:

小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。请你计算 最多 能喝到多少瓶酒。

🌠示例 1:

educoderpython空瓶换酒 python空瓶换购_图搜索算法

输入:numBottles = 9, numExchange = 3
 输出:13
 原由:你可以用 3 个空酒瓶兑换 1 瓶酒。
 所以最多能喝到 9 + 3 + 1 = 13 瓶酒。

🌠示例 2: 

educoderpython空瓶换酒 python空瓶换购_学习_02

输入:numBottles = 15, numExchange = 4
输出:19
原由:你可以用 4 个空酒瓶兑换 1 瓶酒。
 所以最多能喝到 15 + 3 + 1 = 19 瓶酒。

🌠示例 3: 

输入:numBottles = 5, numExchange = 5
输出:6

🌠示例 4: 

输入:numBottles = 2, numExchange = 3
输出:2

题目分析:

当你买入numBottles瓶酒,那么你肯定能喝到numBottles瓶,接下来就要将喝完的numExchange个空瓶子换一瓶新酒,不断重复。

解题思路:

1.将所买的酒记录到喝完的酒中,已喝的酒的瓶数用all表示

2.接着计算喝剩的空酒瓶最多能换多少瓶酒

3.将换到的酒记录到已喝的酒all当中

循环这一过程

educoderpython空瓶换酒 python空瓶换购_python_03

 

代码实现

🌈递归解法:

def numWaterBottles(numBottles, numExchange):
    all = 0
    all += numBottles
    i = numBottles // numExchange   # 整除
    all += i
    j = numBottles % numExchange    # 求余
    if numBottles < numExchange:
        return numBottles

    else:
        while i + j >= numExchange:
            i, j = (i + j) // numExchange, (i + j) % numExchange
            all += i
    return all

值得注意的是:while循环下  i  和  j  要同时负值,像上面的代码一样并列写

如果这样赋值

i = (i + j) // numExchange
j = (i + j) % numExchange
则会出错,因为  i  赋值后会影响下一个  j  的赋值结果

✨ 可以优化一下

def numWaterBottles(numBottles, numExchange):
        all = numBottles
        while numBottles >= numExchange:
            all += numBottles // numExchange
            numBottles = numBottles // numExchange + numBottles % numExchange
        return all

把all的默认值设为numBottles,这样就可以省略 if 语句

numBottles = numBottles // numExchange + numBottles % numExchange等同于 i+j

🌈数学解法:

现在我们假设买进a瓶酒,换一瓶酒需要b个酒瓶。在我们都把酒喝完的情况下,每换一次损失的空酒杯为b - 1,(换一次消耗b个,但是得到一瓶新的,所以为b - 1),那么每换一次我们就可以地到一瓶新酒。

因为我们买进a瓶所以肯定可以喝a瓶

那么我们能换多少次?
🌻1.当a >= b
当剩余的酒瓶数< b时就不能换了
那么有     a - n(b - 1)>= b
现在求最多能换的次数n,即求最小的n使得
 a - n(b - 1)< b
====>n = (a - b)/ (b - 1)    +   1

可以喝的最大瓶数  all  = (a - b)/ (b - 1)    +   1    +  a
🌻2.当 a < b时
我们没足够的酒瓶可换
all = a

代码实现

def numWaterBottles(numBottles, numExchange):
        return (numBottles - numExchange) // (numExchange - 1) + 1 + numBottles if numBottles >= numExchange else numBottles