📌  相关文章
📜  将N个给定的木材切成至少K块,可以达到的最大长度(1)

📅  最后修改于: 2023-12-03 15:25:15.601000             🧑  作者: Mango

题目描述

有N个给定的木材,长度分别为 L1, L2, ..., LN。将这N个木材切成至少K块,可以得到的最大长度是多少?

示例

输入:

N = 5
woodlen = [1, 2, 3, 4, 5]
K = 7

输出:

2
方法

这道题可以使用二分法进行求解,具体思路如下:

  1. 定义二分的上下限,初始状态下,上限就是所有木材长度之和,下限则是0。

  2. 在每一次循环中,求出二分的中点mid,然后我们计算以mid长度来切割这个木材所需要的数量count,如果count >= K,则说明我们可以尝试更大的mid。此时,将下限更新为mid+1。

  3. 如果count < K,则说明还不能达到题目的要求。此时,将上限更新为mid-1。

  4. 当循环结束时,上限会落在一个最大长度的范围内,所以更新最终的答案ans为上限,即为达到K块所能得到的最大长度。

代码实现

以下为Python代码实现:

def check(mid, woodlen, k):
    count = 0
    for wood in woodlen:
        count += wood // mid
    return count >= k

def cut_wood(woodlen, k):
    l = 0
    h = sum(woodlen)
    ans = 0

    while l <= h:
        mid = (l + h) // 2
        if check(mid,woodlen, k):
            ans = mid
            l = mid + 1
        else:
            h = mid - 1

    return ans
复杂性分析

时间复杂度:$O(N*log_2(C))$,其中$C$是二分的上下限,可以看出此算法的时间复杂度与输入数据的规模无关。

空间复杂度:$O(1)$,本算法空间复杂度固定。