买三送一(某外企面试题)

问题描述:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值