1011.在D天内送达包裹的能力

题目:

传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。

示例 1:

输入:weights = [1,2,3,4,5,6,7,8,9,10], days = 5
输出:15
解释:
船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:
第 1 天:1, 2, 3, 4, 5
第 2 天:6, 7
第 3 天:8
第 4 天:9
第 5 天:10

请注意,货物必须按照给定的顺序装运,因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。 

示例 2:

输入:weights = [3,2,2,4,1,4], days = 3
输出:6
解释:
船舶最低载重 6 就能够在 3 天内送达所有包裹,如下所示:
第 1 天:3, 2
第 2 天:2, 4
第 3 天:1, 4

示例 3:

输入:weights = [1,2,3,1,1], days = 4
输出:3
解释:
第 1 天:1
第 2 天:2
第 3 天:3
第 4 天:1, 1

思路:

 这段代码是解决一个特定的物流问题,即确定一艘船在给定的天数内运输一系列包裹所需的最小运载能力。下面是对代码每一行的解释,以及整体的思路和主要思想:
 

#include <vector>
#include <algorithm>
#include <numeric> // 包含 accumulate 函数的头文件
#include <iostream>
using namespace std;

这几行代码是标准C++库的包含语句,用于使用vector、algorithm、numeric和iostream头文件中的函数和类。

// 声明 canShipWithinDays 函数
bool canShipWithinDays(const vector<int>& weights, int days, int capacity);

这行代码声明了一个函数canShipWithinDays,该函数接受三个参数:一个const vector&类型的weights向量,表示包裹的重量;一个int类型的days,表示运输的天数;一个int类型的capacity,表示船的运载能力。该函数返回一个bool类型的值,表示给定的运载能力是否能够在规定的天数内运输完所有的包裹。

int shipWithinDays(vector<int>& weights, int days) {
    // 初始化左右边界
    int left = *max_element(weights.begin(), weights.end()); // 最大包裹重量
    int right = accumulate(weights.begin(), weights.end(), 0); // 所有包裹的总重量

这两行代码初始化了二分查找的左右边界。left被设置为weights向量中的最大包裹重量,right被设置为所有包裹的总重量。

    // 二分查找
    while (left < right) {
        int mid = left + (right - left) / 2; // 防止溢出
        // 计算当前运载能力mid天数内是否能运送完所有包裹
        if (canShipWithinDays(weights, days, mid)) {
            // 如果可以,尝试减小运载能力
            right = mid;
        }
        else {
            // 如果不可以,增加运载能力
            left = mid + 1;
        }
    }
    return left;
}

这段代码是二分查找的主体部分。它持续地在leftright之间查找,直到找到满足条件的最小运载能力。每次迭代中,计算出中间值mid,并检查是否能够在mid的运载能力下在days天内运输完所有包裹。如果可以,就减小右边界;如果不可以,就增加左边界。最后返回找到的左边界值left作为最小运载能力。

// 定义 canShipWithinDays 函数
bool canShipWithinDays(const vector<int>& weights, int days, int capacity) {
    int currentWeight = 0;
    int daysUsed = 1; // 初始天数

这段代码定义了canShipWithinDays函数的实现。它接受一个const vector&类型的weights向量,一个int类型的days,和一个int类型的capacity。函数初始化当前重量currentWeight为0,使用天数daysUsed为1。

    for (int weight : weights) {
        if (currentWeight + weight > capacity) {
            // 如果当前重量加上下一个包裹的重量超过了运载能力,则需要新的一天
            daysUsed++;
            currentWeight = 0;
        }
        currentWeight += weight;
    }

    // 如果在给定的天数内运送完所有包裹,则返回true
    return daysUsed <= days;
}

这段代码通过遍历weights向量中的每个包裹,检查是否可以在days天内运输完所有包裹。如果当前重量加上下一个包裹的重量超过了运载能力,则需要新的一天。每次添加包裹后,更新当前重量currentWeight。最后,如果所有包裹能在给定的天数内被运输完,则返回true,否则返回false。

int main() {
    // 这里可以调用 shipWithinDays 函数进行测试
    // 例如:
     vector<int> weights = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
     int days = 5
     int capacity = shipWithinDays(weights, days);
     cout << "The minimum capacity required is " << capacity << endl;

    return 0;
}

这段代码是程序的入口点,即主函数。首先,创建了一个weights向量并赋值为{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},然后设置运输天数为5。接着调用shipWithinDays函数来计算最小运载能力,并将结果存储在变量capacity中。最后,输出语句将结果打印到控制台,返回0表示程序正常结束。

整体思路:

  1. 使用二分查找算法来确定最小运载能力,该算法在给定的天数内能够保证运输所有的包裹。
  2. canShipWithinDays函数用于检查给定的运载能力是否足够在指定天数内运输所有包裹。
  3. 通过不断调整运载能力的上下界,二分查找算法能够找到满足条件的最小运载能力。

主要思想:

  • 二分查找是一种效率较高的搜索算法,它通过不断缩小区间范围来查找问题的解。
  • 在这个问题中,二分查找的区间是运载能力的可能值,通过检查中间值是否满足条件来调整区间,直到找到最小运载能力。
  • canShipWithinDays函数用于模拟包裹的运输过程,检查给定的运载能力是否能够在规定天数内运输完所有包裹。
  • 程序的核心思想是找到一个平衡点,即最小的运载能力,它既能够保证在给定天数内运输所有包裹,又不会过度超出所需。

 

 

 

 

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值