问题描述:
28名士兵去买水喝,3个空瓶可以换一瓶水,问最多买几瓶水可以使所有的士兵都喝到水,而且不浪费?
问题分析:
这个问题的关键在于3个空瓶换来的水还会产生空瓶,并且第一次购买水的瓶数并不一定是3个倍数。想明白这一点,这个问题就好解了。
如果购买n瓶水, 那么设f(n)为可以赠送水的瓶数,则:
f(n) = (n/3) + ((n/3)+(n%3)/3 + ( ((n/3)+(n%3)/3 + ((n/3)+(n%3))%3 ) / 3 + ...
那么我们最近实际获得的水有 n + f(n) 瓶。
代码如下(python实现):
# Calculate how many extral bottles are free if you buy "num" bottles
def ExtraBottle(num):
n = int(num)
r = 0
while n/3 != 0:
# calc free bottle
r = r + n/3
# calc empty bottle number
#(empty ones of free bottle + empty ones of remainder)
n = n/3 + n%3
return r
def BottleToBuy(num):
i = int(1)
while True:
if (i + ExtraBottle(i) >= num):
break
i += 1
return i
print BottleToBuy(28)
最后答案:19