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

news/2025/1/10 21:17:34/文章来源:https://www.cnblogs.com/drunkerl/p/18664733

在 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

思路

这个问题可以用 二分查找 来解决,目标是找到能够满足在 days 天内完成运送的 船的最低运载能力。问题的关键是二分的对象是谁,二分的范围又是怎么样的?

一般来说,问的是什么,二分查找的对象就是什么,或者就是对应的数组的下标(以我之浅见)。再来考虑范围的问题。

1. 最小运载能力(包裹中的最大重量)

为什么最小运载能力要是包裹中的最大重量?

假设船的运载能力小于包裹中的最大重量,那么船就无法承载最大包裹。这样一来,无论是多大的船都无法运输这些包裹中的最大重量,因此,我们必须保证船的运载能力至少要大于等于包裹中最大单个包裹的重量。

举个例子:

  • 假设有三个包裹,重量分别为 [1, 3, 5],如果船的最大运载能力为 4,那么船就无法运输重量为 5 的包裹,这样就不满足要求。
  • 如果船的运载能力是 5,所有包裹就能被顺利运输。

因此,最小的船的运载能力应该是包裹中最大的一个包裹的重量。

2. 最大运载能力(所有包裹的总重量)

为什么最大运载能力是所有包裹的总重量?

如果船的运载能力等于所有包裹的总重量,那么我们可以把所有的包裹都装在船里,一天之内就完成了运送任务。这是一个极端的情况,船能够一次性运输所有的包裹,因此它的运载能力不需要大于总重量。

举个例子:

  • 如果包裹的重量分别是 [1, 3, 5],那么总重量是 9。如果船的运载能力是 9,那么船可以一次性将所有包裹装下,在一天内完成运输。

因此,船的最大运载能力是所有包裹的总重量。

好,将上述思路整理清楚之后,我们开始整理完整的解题思路。

二分查找的思路

  1. 问题本质: 这个问题本质上是一个 最小化最大值 的问题。我们需要找到一个最小的船的运载能力,使得在 days 天内能够将所有包裹送完。
  2. 二分搜索的对象:
    • 我们要二分搜索的是船的 运载能力,即每艘船在一天内能够装载的最大重量。运载能力的范围是从 包裹中的最大重量所有包裹的总重量
  3. 如何判断一个运载能力是否可行:
    • 给定一个船的运载能力,我们可以模拟每天的装载过程,查看能否在 days 天内将所有包裹运送完。具体地:
      • 按照顺序,逐个包裹装船。如果当前包裹的重量加上已经装载的重量不超过船的运载能力,则继续装载。如果超过了运载能力,则开始新的天数,重新装载包裹。
      • 如果天数超过了 days,则说明当前运载能力不够,需要增加。
  4. 边界条件:
    • left:二分查找的左边界是包裹中的最大重量,因为船的运载能力必须至少能够装载最大的包裹。
    • right:二分查找的右边界是所有包裹的总重量,因为船的运载能力不能超过总重量,否则一天就可以完成任务。
class Solution {private boolean canShip(int[] weights, int capacity, int days){int daysRequired = 1;int currentWeight = 0;for(int weight : weights){//如果放入船上的重量超过运载能力,则新加一天if(currentWeight + weight > capacity){daysRequired++; // 增加一天currentWeight = 0; // 重新开始新的一天}currentWeight += weight; // 当前船上放入包裹}return daysRequired <= days;}public int shipWithinDays(int[] weights, int days) {int left = 0;  //船的最小运载能力为包裹重量的最大值int right = 0; //船的最大运载能力为包裹重量的总和//计算最小和最大的运载能力for(int weight : weights){left = Math.max(left, weight);right += weight;}while(left < right){int mid = left + (right - left) / 2;//如果运载能力mid可以完成任务,尝试更小的能力if(canShip(weights, mid, days)){right = mid; // 试图找到更小的运载能力}else{left = mid + 1; // 需要更大的运载能力}}return left;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867331.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C api简单查询需要的几步

C api查询简单需要的几步 1.准备sql语句 2.绑定变量 通过sqlstatement类bindout方法将查询出来的值与存储他们的变量绑定。 这里绑定是为了以后从结果集中提取一行时只需要一行就可以完成将提取出 来的变量赋值。 3.执行execute 在这一步将sql语句执行。在这里有几个重点 mysql…

iterm2

外观 这个github上的项目提供了很多主题 https://iterm2colorschemes.com/ 亮色主题感觉还可以的几个: OneHalfLight、BuiltinLight、BlulocoLight、Materil、ProLight、Tango Half Adapted 下面截图是基于 Tango Half Adapted用蓝色代替青色,黄色加深之后的效果(vim括号插件…

22. MDI窗口设计

一、什么是MDI窗口MDI 窗口(Multiple-Document Interface),又称多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗口中通常包含子菜单和窗口菜单,用于在窗口或文档之间进行切换。用 QMainWindow 建立的主界面,通常会同时建立或打开多个相互独立…

详解:订单履约系统规划

大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。 通过订单履约系统,消费者可以实时了解商品的物流状态和预…

文件单独编译生成

编译设备树也最好在 source过的那个窗口中来编译错误提示如下: 同时在makefile文件修改时也要注意

In‐band Network Telemetry

#卫星 #遥测技术 #INT 一、INT是什么? INT,In‐band Network Telemetry ,带内网络遥监测。telemetry,英文原意是遥测技术。从其英文名称可以了解如下: a.In-band,说明监测指令及数据均在带内传输 b.telemetry ,说明是长距离,远程获取网络数据的方法。 想象一下卫星在…

潮汐指纹识别工具 : 在线网站识别利器

最近发现了一个免费在线收集网站信息的工具,感觉挺好用的,给各位推荐下。潮汐在线指纹识别是山东新潮信息技术有限公司安全团队提供的一个免费开源在线网站信息收集工具。 功能亮点: 全面扫描 只需输入目标网站的URL或IP地址,即可获取该网站的标题、中间件、操作系统、域名…

JAVA-Day 11:数组的静态初始化和遍历

数组的静态初始化和遍历 数组静态初始化格式 数组的静态初始化与遍历 完整格式:数据类型 [] 数组名=new 数据类型[]{元素1,元素2,元素3,....} 简化格式:数据类型 [] 数组名={元素1,元素2,元素3,....} []在数组名前后都可以 代码如下: int number[]={1,2,3,4,5};for (int …

JAVA-Day 10:Do...While循环语句

Do...While循环语句 Do...While循环格式 初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句); 例: 使用do...while循环输出1-10的和(包括10) int i=1;int count=0;do{count+=i;i++;}while(i<=10);System.out.println(count);代码运行结果如下图所示:

配置tigerVNC,登陆远程服务器

1.在远程服务器安装、配置 (1) sudo apt update sudo apt install xfce4 xfce4-goodies (2) 安装TigerVNC sudo apt install tigervnc-standalone-server (3) 配置vnc vncpasswd (4) 配置.vnc: vim ~/.vnc/xstartup 添加:cat .vnc/xstartup#!/bin/sh # 启动 D-Bus 会话 (如果未…

CF1993F2 Dyn-scripted Robot (Hard Version)

Dyn-scripted Robot (Hard Version) 题目链接。 Problem Easy Version:\(K \le n\)。 Hard Version:\(K \le 10^{12}\)。 一个 \(Oxy\) 平面上有一个 \(w \times h\) 矩形,矩形的左下方有点 \((0, 0)\) ,右上方有点 \((w, h)\) 。 您还有一个最初位于点 \((0, 0)\) 的机器人…

OmniNxt 论文阅读

来源: https://arxiv.org/html/2403.20085?_immersive_translate_auto_translate=1 标题: OmniNxt: A Fully Open-source and Compact Aerial Robot with Omnidirectional Visual Perception OmniNxt 感觉是, 取自 Omnidirectional 中 全的意思, Nxt 像是 Next 的意思,表…