版权声明:本文为博主原创文章,未经博主允许不得转载。 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