码头仓库转运箱子//力扣
你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。
给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 maxWeight ,其中 boxes[i] = [portsi, weighti] 。
portsi 表示第 i 个箱子需要送达的码头, weightsi 是第 i 个箱子的重量。
portsCount 是码头的数目。
maxBoxes 和 maxWeight 分别是卡车每趟运输箱子数目和重量的限制。
箱子需要按照 数组顺序 运输,同时每次运输需要遵循以下步骤:
卡车从 boxes 队列中按顺序取出若干个箱子,但不能违反 maxBoxes 和 maxWeight 限制。
对于在卡车上的箱子,我们需要 按顺序 处理它们,卡车会通过 一趟行程 将最前面的箱子送到目的地码头并卸货。如果卡车已经在对应的码头,那么不需要 额外行程 ,箱子也会立马被卸货。
卡车上所有箱子都被卸货后,卡车需要 一趟行程 回到仓库,从箱子队列里再取出一些箱子。
卡车在将所有箱子运输并卸货后,最后必须回到仓库。
请你返回将所有箱子送到相应码头的 最少行程 次数。
来源:力扣(LeetCode)
#define MAX_LEN 100000
int boxDelivering(int** boxes, int boxesSize, int* boxesColSize, int portsCount, int maxBoxes, int maxWeight){
int i, j, head = 0, tail = 0, n = boxesSize, queue[MAX_LEN] = {0};
long long int neg[n + 1], weight[n + 1], f[n+1], g[n + 1];
memset(neg, 0, sizeof(neg));
memset(weight, 0, sizeof(weight));
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
neg[1] = 0, weight[0] = 0;
for(i = 1; i <= n; i++) {
if(i > 1) {
neg[i] = neg[i - 1] + (boxes[i - 1][0] != boxes[i - 2][0]); // neg[i]表示前i个箱子相邻两个箱子对应码头不同的次数
}
weight[i] = weight[i - 1] + boxes[i - 1][1]; // weight[i]表示前i个箱子的总重量
}
f[0] = 0; // f[i]表示运送前i个箱子需要的最少行程数
queue[tail++] = 0;
for(i = 1; i <= n; i++) {
while(tail > head && (i - queue[head] > maxBoxes || weight[i] - weight[queue[head]] > maxWeight)) {
head++;
}
f[i] = g[queue[head]] + neg[i] + 2;
if(i != n) {
g[i] = f[i] - neg[i + 1];
while(tail > head && g[i] <= g[queue[tail - 1]]) {
tail--;
}
queue[tail++] = i;
}
}
码头仓库转运箱子//力扣相关推荐
- 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!
开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...
- 想去力扣当前端,TypeScript 需要掌握到什么程度?
点击蓝色"脑洞前端"关注我哟 加个"星标",带你揭开大前端的神秘面纱! ❝ 这是脑洞前端第「97」篇原创文章 ❞ 2018 年底的时候,力扣发布了岗位招聘,其中 ...
- 谷歌网页插件实现优雅(bushi)刷力扣
基本功能已经完成,源码见https://github.com/hahahaMing/Google_LeetCode_extension/tree/master/nativeMessaging 文章目录 ...
- 力扣有没有java_力扣 APP 全新改版,史诗级增强!
力扣 APP 全新改版,史诗级增强! 这次的改版真的是判若两人,PC 端的几乎所有功能都可以在新版 APP 中看到,并且体验更好. 不仅之前令我不爽的地方全部不见了,而且多了一些我想都没想到的好用功能 ...
- 几乎刷完了力扣所有的树题,我发现了这些东西
点击蓝色"力扣加加"关注我哟 加个"星标",带你揭开算法的神秘面纱! ❝ 这是力扣加加第「28」篇原创文章 先上下本文的提纲,这个是我用 mindmap 画的一 ...
- GitHub,力扣,电脑组成,ip地址。
1.网站GitHub. gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. gitHub于2008年4月10日正式上线,除了git代 ...
- lucifer与它的《力扣加加》来啦
点击蓝色"力扣加加"关注我哟 加个"星标",带你揭开算法的神秘面纱! ❝ 这是力扣加加第「1」篇原创文章 ❞ 力扣加加 就在今天力扣加加正式脱离[脑洞前端],成 ...
- 力扣1002.查找常用字符
力扣 1002. 查找常用字符 本人力扣练习已上传至码云,可互相学习借鉴. 难度-简单 题目: 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表 ...
- 力扣解题——求根到叶子节点数字之和
难度:中等 题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到 ...
最新文章
- MySQL性能与磁盘读写的关系及优化策略
- android如何设置多条广播,Android使用MulticastSocket实现多点广播图片
- 测试boot库下I/O模型类型
- java面向对象的多态_java面向对象(五)之多态
- 使用mfc修改窗口背景,图表
- python:多维数组变一维数组
- navicat使用手册
- ipv6 dns服务器修改,ipv6服务器dns怎么设置
- 使用.net进行视频格式转换
- 后缀–ize_英语常用后缀-ize
- 问题 C: 神奇的口袋
- Beamer编译排错
- 计算机打字训练教学教案,打字练习小游戏教案.doc
- 程序员,停止你的焦虑
- C#大作业(FPS大型单机游戏)笔记简记
- 2022Java后端学习主流知识学习系列(建议先收藏)
- android xutils 注解,android Xutils dbutils 注解
- 股票指标之波浪理论——直观理解
- 从《C++ Primer 第四版》入手学习 C++
- 计算机经常黑屏,电脑频繁黑屏,和电源有关系吗