Wood Cut

http://www.lintcode.com/zh-cn/problem/wood-cut/

有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。

 注意事项

木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。

 

Lintcode上面的一道题目,很有意思,光看题可能想象不出是用二分来做。但是实际小段的长度可以使用二分来确定。left为0,right为原始木头的最长长度(注意不是最小长度)。但是这道题二分的复杂度也不是O(logn)而是和木头的数目也成正比关系(每次对于划分的长度,需要计算一遍所有的木头得到可以锯出的小段数目)。具体代码如下:

class Solution:
    """
    @param L: Given n pieces of wood with length L[i]
    @param k: An integer
    return: The maximum length of the small pieces.
    """
    def woodCut(self, L, k):
        if not L:
            return 0

        l = 0
        r = max(L)
        
        while l+1 < r:
           mid = l + (r-l)/2
           if  sum([i/mid  for i in L]) >= k:
               l = mid 
           else:
               r = mid
        if sum([i/r for i in L]) < k:
            return l 
        else:
            return r 

 

 

 

 

posted on 2016-05-15 22:38  Sheryl Wang  阅读(395)  评论(0编辑  收藏  举报

导航