【Leetcode】1518. Water Bottles(配数学证明)

题目地址:

https://leetcode.com/problems/water-bottles/

某个商店促销, k k k个空瓶可以换一瓶水。现从商店买 n n n瓶水,问最多能喝到多少瓶水。

可以这样考虑。先喝掉 n n n瓶水产生 n n n个空瓶。接着将这 n n n个空瓶按照每组 k − 1 k-1 k1个瓶子分组,然后从第二组借一个空瓶放到第一组,换水喝,然后再还回去,然后从第三组借一个空瓶放到第二组,换水喝,然后再还回去。进行这样的操作若干次,直到凑不出 k k k个空瓶为止。我们看到,让 n n n k − 1 k-1 k1做带余除法,当 n = m ( k − 1 ) + r n=m(k-1)+r n=m(k1)+r的时候,其中 k − 1 > r ≥ 0 k-1>r\ge 0 k1>r0。当 r = 0 r=0 r=0时,能换 m − 1 m-1 m1瓶水,否则能换 m m m瓶水,所以答案就是 n + ⌊ n − 1 k − 1 ⌋ n+\lfloor \frac{n-1}{k-1} \rfloor n+k1n1其次,是否这就是最优解呢。设 x x x是最优解,也就是全程喝了 x x x瓶水,那么去掉一开始的 n n n瓶水,剩余 x − n x-n xn个其实是用空瓶换出来的,所以被用于换水的空瓶数量就是 ( x − n ) k (x-n)k (xn)k。一共最多就 x x x个空瓶,并且最后的最后还会剩余空瓶,不可能最后一瓶不剩的,所以有 ( x − n ) k ≤ x − 1 (x-n)k\le x-1 (xn)kx1所以 ( k − 1 ) x ≤ n k − 1 x ≤ n k − n + n − 1 k − 1 = n + n − 1 k − 1 (k-1)x\le nk-1\\x\le \frac{nk-n+n-1}{k-1}=n+\frac{n-1}{k-1} (k1)xnk1xk1nkn+n1=n+k1n1 x x x是整数,所以 x ≤ n + ⌊ n − 1 k − 1 ⌋ x\le n+\lfloor\frac{n-1}{k-1}\rfloor xn+k1n1综上所述,最终答案就是 n + ⌊ n − 1 k − 1 ⌋ n+\lfloor\frac{n-1}{k-1}\rfloor n+k1n1

public class Solution {
    public int numWaterBottles(int numBottles, int numExchange) {
        return numBottles + (numBottles - 1) / (numExchange - 1);
    }
}

时空复杂度 O ( 1 ) O(1) O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值