你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。

给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 maxWeight ,其中 boxes[i] = [ports​​i​, weighti] 。

ports​​i 表示第 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;
        }
    }

码头仓库转运箱子//力扣相关推荐

  1. 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!

    开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...

  2. 想去力扣当前端,TypeScript 需要掌握到什么程度?

    点击蓝色"脑洞前端"关注我哟 加个"星标",带你揭开大前端的神秘面纱! ❝ 这是脑洞前端第「97」篇原创文章 ❞ 2018 年底的时候,力扣发布了岗位招聘,其中 ...

  3. 谷歌网页插件实现优雅(bushi)刷力扣

    基本功能已经完成,源码见https://github.com/hahahaMing/Google_LeetCode_extension/tree/master/nativeMessaging 文章目录 ...

  4. 力扣有没有java_力扣 APP 全新改版,史诗级增强!

    力扣 APP 全新改版,史诗级增强! 这次的改版真的是判若两人,PC 端的几乎所有功能都可以在新版 APP 中看到,并且体验更好. 不仅之前令我不爽的地方全部不见了,而且多了一些我想都没想到的好用功能 ...

  5. 几乎刷完了力扣所有的树题,我发现了这些东西

    点击蓝色"力扣加加"关注我哟 加个"星标",带你揭开算法的神秘面纱! ❝ 这是力扣加加第「28」篇原创文章 先上下本文的提纲,这个是我用 mindmap 画的一 ...

  6. GitHub,力扣,电脑组成,ip地址。

    1.网站GitHub. gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. gitHub于2008年4月10日正式上线,除了git代 ...

  7. lucifer与它的《力扣加加》来啦

    点击蓝色"力扣加加"关注我哟 加个"星标",带你揭开算法的神秘面纱! ❝ 这是力扣加加第「1」篇原创文章 ❞ 力扣加加 就在今天力扣加加正式脱离[脑洞前端],成 ...

  8. 力扣1002.查找常用字符

    力扣 1002. 查找常用字符 本人力扣练习已上传至码云,可互相学习借鉴. 难度-简单 题目: 给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表 ...

  9. 力扣解题——求根到叶子节点数字之和

    难度:中等 题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到 ...

最新文章

  1. MySQL性能与磁盘读写的关系及优化策略
  2. android如何设置多条广播,Android使用MulticastSocket实现多点广播图片
  3. 测试boot库下I/O模型类型
  4. java面向对象的多态_java面向对象(五)之多态
  5. 使用mfc修改窗口背景,图表
  6. python:多维数组变一维数组
  7. navicat使用手册
  8. ipv6 dns服务器修改,ipv6服务器dns怎么设置
  9. 使用.net进行视频格式转换
  10. 后缀–ize_英语常用后缀-ize
  11. 问题 C: 神奇的口袋
  12. Beamer编译排错
  13. 计算机打字训练教学教案,打字练习小游戏教案.doc
  14. 程序员,停止你的焦虑
  15. C#大作业(FPS大型单机游戏)笔记简记
  16. 2022Java后端学习主流知识学习系列(建议先收藏)
  17. android xutils 注解,android Xutils dbutils 注解
  18. 股票指标之波浪理论——直观理解
  19. 从《C++ Primer 第四版》入手学习 C++
  20. 计算机经常黑屏,电脑频繁黑屏,和电源有关系吗

热门文章

  1. 马斯克又任性了!将推特“蓝鸟”换成“狗头”,意欲何为?
  2. ggplot2的一些有用的绘图案例
  3. pr转场 卡通炫酷图形动画视频转场pr模板mogrt
  4. PYTHON画爱心(利用pycharm)
  5. html页面图片分页样式,HTML页面打印分页标签样式
  6. 河北 涉密计算机系统集成资质,浙江国家涉密系统集成资质
  7. PPT快速制作工具调研
  8. WLAN工作过程——第一阶段AP上线
  9. QtCharts图形移动和缩放
  10. 12V输入给三节锂电池充电芯片