巨人吃豆

代码题:
有一个巨人,每走一米需要吃一颗豆子,身上最多带m颗豆子,桥长n米,桥这边有无数颗豆子,问巨人过桥最少要吃多少颗豆子。(巨人可以在桥上放豆子折返)
1、m=60,n=80 最少需要多少颗;如何证明是最少
2、m=60, n=81 最少需要多少颗
3、写代码实现 f(m,n)

要求1个小时内返回结果,给出 分析、思路和代码。

# coding=utf-8

def f(tempM,tempN):
    count = 0
    # [minN,maxN]
    minN = 0
    maxN = 0
    # [minBean,maxBean]
    minBean = 0
    maxBean = 0
    while(1):
        if tempN <= maxN:
            res = minBean+(tempN-minN)*(2*(count-1)+1)
            break
        else:
            #tempM*(count+1)-(2*count+1)*a >= maxBean
            #(2 * count + 1) * a <= tempM*(count+1)-maxBean
            a = (tempM*(count+1)-maxBean)/(2*count+1)
            minN = maxN
            maxN = maxN + a
            minBean = maxBean
            maxBean = maxBean + a*(2*count+1)
            count = count + 1

    return res



if __name__ == "__main__":

    n = 81
    m = 60

    print f(m,n)

你可能感兴趣的:(python)