C++前缀和算法的应用:装包裹的最小浪费空间 原理源码测试用例

news2024/9/27 9:20:42

本文涉及的基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频

题目

给你 n 个包裹,你需要把它们装在箱子里,每个箱子装一个包裹。总共有 m 个供应商提供 不同尺寸 的箱子(每个规格都有无数个箱子)。如果一个包裹的尺寸 小于等于 一个箱子的尺寸,那么这个包裹就可以放入这个箱子之中。
包裹的尺寸用一个整数数组 packages 表示,其中 packages[i] 是第 i 个包裹的尺寸。供应商用二维数组 boxes 表示,其中 boxes[j] 是第 j 个供应商提供的所有箱子尺寸的数组。
你想要选择 一个供应商 并只使用该供应商提供的箱子,使得 总浪费空间最小 。对于每个装了包裹的箱子,我们定义 浪费的 空间等于 箱子的尺寸 - 包裹的尺寸 。总浪费空间 为 所有 箱子中浪费空间的总和。
比方说,如果你想要用尺寸数组为 [4,8] 的箱子装下尺寸为 [2,3,5] 的包裹,你可以将尺寸为 2 和 3 的两个包裹装入两个尺寸为 4 的箱子中,同时把尺寸为 5 的包裹装入尺寸为 8 的箱子中。总浪费空间为 (4-2) + (4-3) + (8-5) = 6 。
请你选择 最优 箱子供应商,使得 总浪费空间最小 。如果 无法 将所有包裹放入箱子中,请你返回 -1 。由于答案可能会 很大 ,请返回它对 109 + 7 取余 的结果。
示例 1:
输入:packages = [2,3,5], boxes = [[4,8],[2,8]]
输出:6
解释:选择第一个供应商最优,用两个尺寸为 4 的箱子和一个尺寸为 8 的箱子。
总浪费空间为 (4-2) + (4-3) + (8-5) = 6 。
示例 2:
输入:packages = [2,3,5], boxes = [[1,4],[2,3],[3,4]]
输出:-1
解释:没有箱子能装下尺寸为 5 的包裹。
示例 3:
输入:packages = [3,5,8,10,11,12], boxes = [[12],[11,9],[10,5,14]]
输出:9
解释:选择第三个供应商最优,用两个尺寸为 5 的箱子,两个尺寸为 10 的箱子和两个尺寸为 14 的箱子。
总浪费空间为 (5-3) + (5-5) + (10-8) + (10-10) + (14-11) + (14-12) = 9 。

参数范围
n == packages.length
m == boxes.length
1 <= n <= 105
1 <= m <= 105
1 <= packages[i] <= 105
1 <= boxes[j].length <= 105
1 <= boxes[j][k] <= 105
sum(boxes[j].length) <= 105
boxes[j] 中的元素 互不相同 。

分析

思路

用v代表某个商人所有的箱子,按升序排序。v[0]尺寸的箱子装所有尺寸小于等于v[0]的包括,就是v[0]箱子的数量等于,尺寸为[0,v[0]]箱子的数量。同理v[1]的数量等于尺寸为(v[0],v[1]]包裹的数量。

注意

如果商人最大号的箱子小于最大号包裹,则不能选择此商人。如果所有商人都不能选择,则返回-1。如果多个箱子大于最大号的包裹,这些箱子中只有第一个有用。
用前缀和计算包裹的数量,小心索引溢出。

变量含义

iMax最大号包裹尺寸
vSumvSum[i] 等于 空间小于等于i 的包裹数量
llNeed所有包裹的总空间
cur当前商人提供的箱子的总空间

代码

核心代码

class Solution {
public:
int minWastedSpace(vector& packages, vector<vector>& boxes) {
int iMax = *std::max_element(packages.begin(), packages.end());
vector vNum(iMax + 1);
long long llNeed = 0;
for (const auto& n : packages)
{
vNum[n]++;
llNeed += n;
}
vector vSum = { 0 };//vSum[i] 等于 空间小于等于i 的包裹数量
for (int i = 1; i <= iMax; i++)
{
vSum.emplace_back(vSum.back() + vNum[i]);
}
long long llHas = LLONG_MAX;
for (auto& v : boxes)
{
sort(v.begin(), v.end());
if (v.back() < iMax)
{
continue;
}
int pre = 0;
long long cur = 0;//当前空间上提供的包裹的总容量
for ( auto& n : v)
{
cur += ((long long)vSum[min(n,iMax)] - vSum[pre]) * n;
pre = n;
if (n >= iMax)
{
break;
}
}
llHas = min(llHas, cur);
}
if (LLONG_MAX == llHas)
{
return -1;
}
const long long llMod = 1e9 + 7;
return (llHas - llNeed) % llMod;
}
};

测试用例

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
assert(v1[i] == v2[i]);
}
}

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

int main()
{
Solution slu;
vector packages;
vector<vector>boxes;
int res = 0;
packages = { 3,5,8,10,11,12 };
boxes = { {12},{11,9},{10,5,14} };
res = slu.minWastedSpace(packages, boxes);
Assert(9, res);
packages = { 3, 5, 8, 7, 5, 8, 10, 11, 12 };
boxes = { {12},{11,9},{10,5,14} };
res = slu.minWastedSpace(packages, boxes);
Assert(14, res);
packages = { 2,3,5 };
boxes = { {4,8},{2,8} };
res = slu.minWastedSpace(packages, boxes);
Assert(6, res);
packages = { 2,3,5,8,7,6 };
boxes = { {4,8},{2,8} };
res = slu.minWastedSpace(packages, boxes);
Assert(9, res);

//CConsole::Out(res);

}

2023年3月旧代码

class Solution {
public:
int minWastedSpace(vector& packages, vector<vector>& boxes) {
std::sort(packages.begin(), packages.end());
vector vSums(1);
for (const auto& pack : packages)
{
vSums.emplace_back(pack + vSums.back());
}
std::priority_queue que;
for (auto& v : boxes)
{
std::sort(v.begin(), v.end());
long long llCur = 0;
int iHasDo = 0;
for (int j = 0; j < v.size(); j++)
{
auto iCurDoEnd = std::upper_bound(packages.begin() + iHasDo, packages.end(), v[j]) - packages.begin();
long long llCurBox = (long long)v[j] * (iCurDoEnd - iHasDo) - (vSums[iCurDoEnd] - vSums[iHasDo]);
llCur += llCurBox;
iHasDo = iCurDoEnd;
}
if (packages.size() == iHasDo)
{
que.push(llCur);
if (que.size() > 1)
{
que.pop();
}
}
}
return que.size() ? C1097Int<>(que.top()).ToInt() : -1 ;
}
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

| 鄙人想对大家说的话
|
|-|
|闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。|
| 墨家名称的来源:有所得以墨记之。 |
|如果程序是一条龙,那算法就是他的是睛|

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境:

VS2022 C++17

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑豹程序员-架构师学习路线图-百科:Mybatis的伴侣MybatisPlus

文章目录 1、什么是MybatisPlus&#xff1f;2、MybatisPlus发展历史 1、什么是MybatisPlus&#xff1f; java单体项目几乎已经被SSM三大框架所垄断&#xff0c;而M就代表Mybatis。 但Mybatis的结构还是较复杂的&#xff0c;例如&#xff1a;User模块&#xff0c;需要写UserMap…

[开源]一个低代码引擎,支持在线实时构建低码平台,支持二次开发

一、开源项目简介 TinyEngine低代码引擎使能开发者定制低代码平台&#xff0c;支持在线实时构建低码平台&#xff0c;支持二次开发或集成低码平台能力。 二、开源协议 使用MIT开源协议 三、界面展示 四、功能概述 TinyEngine是一个低代码引擎&#xff0c;基于这个引擎可以构…

如何批量给视频添加logo水印?

如果你想为自己的视频添加图片水印&#xff0c;以增强视频的辨识度和个性化&#xff0c;那么你可以使用固乔剪辑助手软件来实现这一需求。下面就是详细的操作步骤&#xff1a; 1.下载并打开固乔剪辑助手软件&#xff0c;这是一款简单易用的视频剪辑软件&#xff0c;功能丰富&am…

实验数据旋转角度处理过程中的常见问题

问题 做实验过程中使用 EM tracker 测量自己机器人末端旋转时的角度。 尾部 设置EMTracker 1&#xff0c;作为固定基准&#xff0c;其轴线与机器人中心轴线近似重合&#xff0c;EM Tracker 2 固定在机器人活动关节上&#xff0c;两者轴线夹角近似为机器人旋转角度。论文尚未发…

Jenkins 安装全攻略:从入门到精通

目录 一&#xff1a;安装文件夹准备 1.打开&#xff0c;/home/admin目录 2.新建三个文件夹 二&#xff1a;安装tomcat 1.打开tomcat目录进行tomcat安装 2.解压tomcat文件 3.开放端口号 4.启动tomcat 5.浏览器访问tomcat 三&#xff1a;安装Maven 1.打开maven目录进行…

VB.NET 三层登录系统实战:从设计到部署全流程详解

目录 前言&#xff1a; 什么是三层 为什么要用到三层: 饭店→软件 理解: 过程: 1.三层包图: 2.数据库 3.三层项目 4.用户界面 5.添加引用 代码实现: Entity层 BLL层 DAL层 UI层 总结: 前言&#xff1a; 什么是三层 三层就是把各个功能模块划分为表示层&#…

python访问Wikipedia

import wikipedia # doc: https://pypi.org/project/wikipedia/def searchWikiPedia(keyword, language) -> str:wikipedia.set_lang(language)result wikipedia.page(keyword)return result.contentif __name__"__main__":# 设置语言https://meta.wikimedia.org…

Leetcode刷题详解——x的平方根

1. 题目链接&#xff1a;69. x 的平方根 2. 题目描述&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 **注意&#xff1a;**不允许使用任何内置指数函数和…

网站搬家的多种方法

网站搬家&#xff0c;把网站从一个服务器迁移到另一个服务器&#xff0c;涉及到网站文件和数据库的备份、上传、导入等操作&#xff0c;最重要的是备份网站&#xff0c;避免迁移出现问题无法恢复网站。 根据不同的情景和需求&#xff0c;网站搬家的方法有多种&#xff0c;下面…

什么是Docker CLI

Docker CLI&#xff08;命令行界面&#xff09;是一个工具&#xff0c;允许用户通过命令行或终端与Docker进行交互。Docker是一个开源平台&#xff0c;用于开发、运送和运行应用程序。Docker使用容器化技术来打包应用程序及其依赖项&#xff0c;以确保在不同环境中的一致性和隔…

Axure 9 使用 font awesome 字体发布原型

我使用的版本为Font awesome 6.1.1&#xff0c;安装后在axure中新增3个字体 如果直接发布&#xff0c;在没有安装Font awesome的电脑上无法正常显示字体图标&#xff0c;需要在发布前进行设置。 设置方法&#xff1a; 点击共享 点开设置 在字体设置页&#xff0c;填入图中所示…

golang小游戏:飞翔的小鸟

游戏开发总体思路 首先要选取一个合适的图形化界面进行开发。该项目选取的是 ebiten 一个用于创建2D游戏和图形应用程序的游戏引擎&#xff0c;提供了一些简单的GUI功能。 其次明确游戏设计思路。飞翔的小鸟共分为三个场景。 第一个场景就是游戏开始前的准备阶段&#xff0c…

微信小程序:点击按钮出现右侧弹窗

效果 代码 wxml <!-- 弹窗信息 --> <view class"popup-container" wx:if"{{showPopup}}"><view class"popup-content"><!-- 弹窗内容 --><text>这是一个右侧弹窗</text></view> </view> <…

【Spring】使用aop切面编程时要给那些类加注解

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理 Spring 中使用aop切面编程时要给那些类加注解 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一…

python 之运算符

文章目录 总的介绍代码例子 总的介绍 Python中有许多不同类型的运算符&#xff0c;它们用于执行各种操作&#xff0c;包括算术运算、比较、逻辑运算等。以下是Python中常用的运算符&#xff1a; 算术运算符&#xff1a; &#xff1a;加法&#xff0c;用于将两个数相加。-&…

PhpStorm快速注释与取消注释

ctrl / 单行注释 ctrl shift / 多行注释 重复以上操作&#xff0c;取消注释。

Slax Linux 获得增强的会话管理和启动参数选项

Slax Linux 的创建者和维护者托马斯-马特吉切克&#xff08;Tomas Matejicek&#xff09;在自己生日这天&#xff08;生日快乐&#xff01;&#xff09;发布了其小巧便携的 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强功能和错误修复。 新发布的 Slax Linux 版本&…

优雅的使用String字符串处理各种类型转换

文章目录 &#x1f31f; 优雅的使用String字符串处理各种类型转换&#x1f34a; 基本类型转字符串&#x1f34a; 字符串转基本类型&#x1f34a; 字符串与字符数组的转换&#x1f34a; 字符串与字节数组的转换&#x1f34a; 其他类型转字符串&#x1f34a; 总结 &#x1f4d5;我…

AIGC实战——深度学习 (Deep Learning, DL)

AIGC实战——深度学习 0. 前言1. 深度学习基本概念1.1 基本定义1.2 非结构化数据 2. 深度神经网络2.1 神经网络2.2 学习高级特征 3. TensorFlow 和 Keras4. 多层感知器 (MLP)4.1 准备数据4.2 构建模型4.3 检查模型4.4 编译模型4.5 训练模型4.6 评估模型 小结系列链接 0. 前言 …

UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

目录 0 引言1 全局对象&#xff08;全局变量&#xff09;1.1 游戏实例 GameInstance1.1.1 介绍1.1.2 使用 GameInstance 1.2 玩家控制器 PlayerController1.3 游戏世界类 UWorld &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&…