切分木棒

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Einstellung/article/details/83988246

假设要把长度为 n 厘米的木棒切分为 1 厘米长的小段,但是 1 根木棒只能由 1 人切分,当木棒被切分为 3 段后,可以同时由 3 个人分别切分木棒( 图2 )。
求最多有 m 个人时,最少要切分几次。譬如 n = 8,m = 3 时如下图所示,切分 4 次就可以了。
在这里插入图片描述

这个题思路的核心就在于尽快让更多的人参与到工作中来

方法一:使用递归调用实现。显然这个切的过程中,前面可以按照指数方式进行递增,后面就只能一条一条的切了。

# n是多少厘米长的木棒,m是几个人,current是目前切了几段了
def cutbar(n, m, current):  
    if current >= n:
        return 0
    if current < m:
        return 1 + cutbar(n, m, current*2)
    else:
        return 1 + cutbar(n, m, current + m)

方法二:逆向思考。 本题可以等价为m个人黏合1厘米的木棒以组成n厘米的木棒。也就是说,最后黏合的木棒长度总长为n厘米就够了。

def cutbar2(n, m):
    count = 0
    current = 1 # current是当前长度,同顺序思维是一样的,开始只能加一次,加两次,一直到数m之前。
    while n > current:
        current += current if current < m else m
        count = count + 1
        
    return count  

猜你喜欢

转载自blog.csdn.net/Einstellung/article/details/83988246