题目地址:
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 k−1个瓶子分组,然后从第二组借一个空瓶放到第一组,换水喝,然后再还回去,然后从第三组借一个空瓶放到第二组,换水喝,然后再还回去。进行这样的操作若干次,直到凑不出 k k k个空瓶为止。我们看到,让 n n n对 k − 1 k-1 k−1做带余除法,当 n = m ( k − 1 ) + r n=m(k-1)+r n=m(k−1)+r的时候,其中 k − 1 > r ≥ 0 k-1>r\ge 0 k−1>r≥0。当 r = 0 r=0 r=0时,能换 m − 1 m-1 m−1瓶水,否则能换 m m m瓶水,所以答案就是 n + ⌊ n − 1 k − 1 ⌋ n+\lfloor \frac{n-1}{k-1} \rfloor n+⌊k−1n−1⌋其次,是否这就是最优解呢。设 x x x是最优解,也就是全程喝了 x x x瓶水,那么去掉一开始的 n n n瓶水,剩余 x − n x-n x−n个其实是用空瓶换出来的,所以被用于换水的空瓶数量就是 ( x − n ) k (x-n)k (x−n)k。一共最多就 x x x个空瓶,并且最后的最后还会剩余空瓶,不可能最后一瓶不剩的,所以有 ( x − n ) k ≤ x − 1 (x-n)k\le x-1 (x−n)k≤x−1所以 ( 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} (k−1)x≤nk−1x≤k−1nk−n+n−1=n+k−1n−1 x x x是整数,所以 x ≤ n + ⌊ n − 1 k − 1 ⌋ x\le n+\lfloor\frac{n-1}{k-1}\rfloor x≤n+⌊k−1n−1⌋综上所述,最终答案就是 n + ⌊ n − 1 k − 1 ⌋ n+\lfloor\frac{n-1}{k-1}\rfloor n+⌊k−1n−1⌋。
public class Solution {
public int numWaterBottles(int numBottles, int numExchange) {
return numBottles + (numBottles - 1) / (numExchange - 1);
}
}
时空复杂度 O ( 1 ) O(1) O(1)。