LintCode 183 [Wood Cut]

原题

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

有3根木头[232, 124, 456], k=7, 最大长度为114.

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

解题思路

  • 思路:Binary Search
  • 问题又可以转化成在1和给的所有原木中最长的长度中间找一个合适的长度,使得把每段原木按此分段后得到的小段木头数目至少为k
  • 扩展,除法转化为二分法,求100除以5,相当于在0到100之间找一个数使得x*5小于等于100,(x+1)*5大于100

完整代码

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 sum(L) < k:
            return 0
            
        start, end = 1, max(L)
        while start + 1 < end:
            mid = start + (end - start) / 2
            pieces = sum([l / mid for l in L])
            if pieces >= k:
                start = mid
            else:
                end = mid
                
        if sum([l / end for l in L]) > k:
            return end
        return start

你可能感兴趣的:(LintCode 183 [Wood Cut])