青训营X豆包MarsCode 技术训练营刷题1 | 豆包MarsCode AI 刷题

111 阅读3分钟

传送带包裹运输问题

小R需要在指定的天数(days)内将一批包裹从一个港口运输到另一个港口。每个包裹的重量由一个数组 weights 表示,其中第 i 个包裹的重量为 weights[i]

小R按照包裹在数组中的顺序装载包裹,船的运载能力有一个上限,每一天装载的总重量不能超过这个上限。为了确保在规定的天数内完成运输任务,小R希望找出船的最低运载能力,以便能在 days 天内将所有包裹运输到目的地。

输入:

  • weights:一个整数数组,表示每个包裹的重量。
  • days:一个整数,表示运输包裹的天数。

输出:

  • 返回一个整数,表示船的最低运载能力,使得所有包裹能够在 days 天内全部送达。

示例:

  1. 输入:weights = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1], days = 5 输出:15

  2. 输入:weights = [3, 2, 2, 5, 1, 4], days = 2 输出:10

  3. 输入:weights = [1, 2, 3, 8, 4], days = 4 输出:8

通过以上描述,我们的目标是找到一个最小的船运载能力,确保所有包裹可以在给定的天数内送达。 要解决这个问题,我们需要找到在给定天数内运输所有包裹所需的最小船的运载能力。我们可以使用二分搜索来高效地找到这个能力。

问题的解决思路:

  1. 确定搜索范围

    • 最小的运载能力 low:取包裹中最大的重量,因为船的能力至少要能承载最重的包裹。
    • 最大的运载能力 high:所有包裹重量的总和,因为如果船的能力等于所有包裹的总和,那么只需一天即可完成运输。
  2. 定义一个检查函数

    • 使用一个函数 canShip(weights, capacity, days) 来判断在给定的运载能力下,是否可以在 days 天内运输所有包裹。
    • 遍历包裹重量,累加重量,如果累加的重量超过当前能力,则需要增加一天,重置累加重量。
    • 如果增加的天数超过 days,则返回 False
  3. 进行二分搜索

    • lowhigh 之间进行二分搜索。
    • 对于中间的运载能力 mid,使用 canShip 函数检查是否可以在 days 天内运输。
    • 如果可以,则尝试更小的能力(更新 high),否则增加能力(更新 low)。
  4. 返回结果

    • 最终的 low 值就是所需的最小运载能力。

实现代码:

def canShip(weights, capacity, days):
    total_weight = 0
    required_days = 1  # At least one day needed
    for weight in weights:
        if total_weight + weight > capacity:
            # If adding this weight exceeds capacity, we need a new day
            required_days += 1
            total_weight = weight
            if required_days > days:
                return False
        else:
            total_weight += weight
    return True

def shipWithinDays(weights, days):
    low = max(weights)  # Minimum possible capacity
    high = sum(weights)  # Maximum possible capacity

    while low < high:
        mid = (low + high) // 2
        if canShip(weights, mid, days):
            high = mid  # Try for a smaller capacity
        else:
            low = mid + 1  # Increase capacity

    return low  # This will be the minimum capacity needed

# 测试样例
print(shipWithinDays([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1], 5))  # 输出: 15
print(shipWithinDays([3, 2, 2, 5, 1, 4], 2))  # 输出: 10
print(shipWithinDays([1, 2, 3, 8, 4], 4))  # 输出: 8