华为OD机试真题 Java 实现【统一限载货物数最小值】【2023Q1 200分】

news2024/11/26 20:42:55

在这里插入图片描述

一、题目描述

火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度 2K 辆中转车(K辆干货中转车,K 辆湿货中转车)货物由不同供货商从各地发来,各地的货物是依次进站,然后小明按照卸货顺序依次装货到中转车,一个供货商的货只能装到一辆车上不能拆装,但
是一辆车可以装多家供货商的货:中转车的限载货物量由小明统一指定,在完成货物中转的前提下,请问中转车的统一限载货物数最小值为多少。

二、输入描述

第一行 length 表示供货商数量 1 <= length <= 104
第二行 goods 表示供货数数组 1 <= goods[i] <= 104
第三行 types[i]表示对应货物类型,types[i]等于 0 或者 1,其中 0 代表干货,1 代表湿货;
第四行 k 表示单类中转车数量 1 <= k <= goods.length;

三、输出描述

运行结果输出一个整数,表示中转车统一限载货物数。

备注:中转车最多跑一趟仓库。

四、题目解析

货物由不同供货商从各地发来,各地的货物是依次进站,然后小明按照卸货顺序依次装货到中转车,一个供货商的货只能装到一辆车上,不能拆装,但是一辆车可以装多家供货商的货;这意味着,我们不难改变输入的顺序,要按照输入的顺序去装车。并且干货只能装到干货车,
湿货只能装到湿货车。

比如用例 1 中:
4
3 2 6 3
0 1 1 0
2

第 1 个货物是: 干货,因此装到干货车
第 2 个货物是:湿货,由于湿货不难装到干货车,因此第一辆车只装一个货物就必须走。第二个货物需要装到一辆湿货车上。
第 3 个货物是:湿货,前一步的湿货车还没走,此时我们有两种选择。将第 3 个货物继续装到前面的湿货车上,即和第 2 个货物装一起,但是会导致最低限载被提高。将第 3 个货物装到下一辆湿货车上。
第 4 个货物是:干货,因此只能重新要一辆干货车,继续装载说到这里,大家可能已经感觉出来,连续的 0(干货)可以用一辆车运,也可以分成多辆车运,而一旦连续 0(干货)被中断,即出现了 1(湿货),则前面的干货车必须走,这个湿货需要申请一辆湿货车来运根据上面逻辑,我们可以将连续干货 和 连续湿货 对应的区间段统计出来:

连续干货:[3]、[3]

连续湿货:[2,6]

  • 如果连续干货的区间段数 刚好等于 k,则刚好每段连续干货,都可以分配一辆干货车;
  • 如果连续干货的区间段数<k,则出了必要的给每段分配一辆干货车外,还有多余的干货车可以继续分配:此时,我们应该将多段连续干货,按照和大小降序,优先给 和最大 的连续干货段多分配一辆车,即相当于将一个区间一分为二,这样最低限载就降低了,并且多出的干货车数量减 1。如果多余的干货车数量不等于 0,则继续按上面逻辑,分配一辆车给 和最大 的连续干货段。直到多余的干货车用完。
  • 如果连续干货的区间段数 >k,此时是无法完成运输任务的,应该视为异常情况,但是本题没有说明异常处理,因此可以认为此场景不存在。

上面逻辑中,每次将区间一份为二后,都要重新按照 区间和大小降序,这里可以用 优先队列。

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] goods = new int[n];
    for (int i = 0; i < n; i++) {
        goods[i] = sc.nextInt();
    }
    int[] types = new int[n];
    for (int i = 0; i < n; i++) {
        types[i] = sc.nextInt();
    }
    int k = sc.nextInt();
    System.out.println(getResult(n, goods, types, k));
}

public static int getResult(int n, int[] goods, int[] types, int k) {
    PriorityQueue<LinkedList<Integer>> drys = new PriorityQueue<>((a, b) -> b.get(0) - a.get(0));
    PriorityQueue<LinkedList<Integer>> wets = new PriorityQueue<>((a, b) -> b.get(0) -
            a.get(0));
    boolean isDry = true;
    LinkedList<Integer> tmp = new LinkedList<>();
    int sum = 0;
    for (int i = 0; i < n; i++) {
        if (types[i] == 0) {
            if (isDry) {
                tmp.add(goods[i]);
                sum += goods[i];
            } else {
                tmp.addFirst(sum);
                wets.offer(tmp);
                tmp = new LinkedList<>();
                sum = 0;
                tmp.add(goods[i]);
                sum += goods[i];
                isDry = true;
            }
        } else {
            if (isDry) {
                tmp.addFirst(sum);
                drys.offer(tmp);
                tmp = new LinkedList<>();
                sum = 0;
                tmp.add(goods[i]);
                sum += goods[i];
                isDry = false;
            } else {
                tmp.add(goods[i]);
                sum += goods[i];
            }
        }
    }
    tmp.addFirst(sum);
    if (isDry) {
        drys.offer(tmp);
    } else {
        wets.offer(tmp);
    }
    int dry_min = divide(drys, k);
    int wet_min = divide(wets, k);
    return Math.max(dry_min, wet_min);
}

public static int divide(PriorityQueue<LinkedList<Integer>> goods, int k) {
    while (goods.size() < k) {
        LinkedList<Integer> top = goods.poll();
        if (top == null) break;
        int dry_sum = top.removeFirst();
        if (top.size() == 1) {
            return dry_sum;
        }
        int splitIdx = 0;
        int splitHalf = 0;
        int half = 0;
        int min = dry_sum;
        for (int i = 1; i < top.size(); i++) {
            int val = top.get(i - 1);
            half += val;
            int max = Math.max(half, dry_sum - half);
            if (max < min) {
                min = max;
                splitIdx = i;
                splitHalf = half;
            }
        }
        LinkedList<Integer> halfList = new LinkedList<>();
        halfList.add(splitHalf);
        halfList.addAll(top.subList(0, splitIdx));
        goods.offer(halfList);
        LinkedList<Integer> otherHalfList = new LinkedList<>();
        otherHalfList.add(dry_sum - splitHalf);
        otherHalfList.addAll(top.subList(splitIdx, top.size()));
        goods.offer(otherHalfList);
    }
    return goods.peek().get(0);
}

六、效果展示

1、输入

4
3 2 6 3
0 1 1 0
2

2、输出

6

在这里插入图片描述


🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述

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

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

相关文章

智能床垫市场调研分析报告

文章目录 一、简介&#xff08;1&#xff09;电动床&#xff08;2&#xff09;气垫床 二、使用人群三、睡姿四、实用性 一、简介 &#xff08;1&#xff09;电动床 电动床之下又分成了分体、连体和床头分体。分体电动床是指床垫与床底座分开的电动床&#xff1b;连体的则是床垫…

数据结构-外部排序-(多路归并排序、败者树、置换选择排序、最佳归并树)

目录 一、外部归并排序 二、败者树 三、置换选择排序 四、最佳归并树 一、外部归并排序 16个块&#xff0c;先每个块读入内存进行排序在输出回来&#xff0c;进行16次读和16次写 两两归并&#xff0c;第一趟如下 在两两归并 时间分析 外部排序时间开销读写外存时间内存排序时…

C语言基础知识:函数的声明和使用

目录 函数的声明 1.定义顺序 2.函数的声明 3.函数的声明格式 多源文件开发 1.为什么要有多个源文件 2.将sum函数写到其他源文件中 3.在main函数中调用sum函数 4.编译所有的源文件 5.链接所有的目标文件 #include 1.#include的作用 2.#include可以使用绝对路径 3.#…

Linux免交互操作

免交互操作 Here DocumentExpect工具 Here Document Here Document概述 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp 、cat 或 read 命令。Here Document 是标准输入的一种替代品&#xff0c;可以帮助脚本开发人员不必使用临时文件来构建输入信息…

docker搭建Elasticsearch集群

这里写目录标题 1.拉取es镜像2.配置配置文件3.启动容器4.启动过程中遇到的问题5.查看容器启动情况 1.拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.0版本根据自己需求进行拉取&#xff0c;我这边选择的是7.17.0&#xff0c;不同版本配置可能稍有…

ANR原理篇 - Input超时机制

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、事件分发流程1.1 事件分发流程概览1.2 InputDispatcher 三、ANR触发流程超时重…

ANR原理篇 - service/broadcast/provider超时机制

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Service超时机制1.1 埋炸弹1.1.1 AS.realStartServiceLocked1.1.2 AS.bumpSer…

三大基础排序算法——我欲修仙(功法篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️我欲修仙】 学习名言&#xff1a;莫等闲、白了少年头&#xff0c;空悲切。——岳飞 系列文章目录 第一章 ❤️ 学习前的必知知识 第二章 ❤️ 二分查找 文章目录 系列文章目录前言&#x1f697;&…

Netty实战(三)

Netty的组件和设计 一、Channel、EventLoop 和 ChannelFuture1.1 Channel 接口1.2 EventLoop 接口1.3 ChannelFuture 接口 二、ChannelHandler 和 ChannelPipeline2.1 ChannelHandler 接口2.2 ChannelPipeline 接口2.3 编码器和解码器2.4 抽象类 SimpleChannelInboundHandler 三…

suricata中DPDK收发包源码分析2

《suricata中DPDK收发包源码分析1》中分析了整体的DPDK收发包框架代码&#xff0c;今天我们继续来深入了解一下一些细节方面的问题。 目录 Q1&#xff1a;收发包线程模式在代码中是怎样确定的&#xff1f; Q2: DPDK库的初始化rte_eal_init在哪里调用的&#xff1f; Q3: 对网…

Linux中LV Status的状态为NOT available

今天下午有现场反馈备份磁盘找不到了&#xff0c;使用lvm方式的。提供了todesk帮忙看下&#xff0c; 首先使用 blkid查看&#xff0c;确实看不到备份磁盘的UUID&#xff0c;使用lvdisplay查看状态&#xff0c;状态不对了 [rootdb1 ~]# lvdisplay --- Logical volume --- …

.Vue3项目初始化

文章目录 1.Vue3项目初始化1.1 创建vue项目1.2 vue 初始化1.3 git 项目管理1.4 配置iconfig.json1.5 element 按需引入1.6 element 主题色的定制1.7 axios的基础配置1.8 router路由的配置 1.Vue3项目初始化 1.1 创建vue项目 npm init vuelatest1.2 vue 初始化 npm install1.…

【2023/05/16】MonteCarlo

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第11天。 Share O Beauty,find theyself in love,not in the flattery of thymirror. 译文&#xff1a; 啊&#xff0c;美啊&#xff0c;在爱中找你自己吧&#xff0c;不要到你镜子的诌谀中去寻找。 M…

[遗传学]转座因子的结构与功能

本篇文章主要带你了解:转座因子的发现和分类;原核生物以及真核生物种的转座子;转座作用的分子机制以及转座因子的遗传学效应和应用. &#x1f9ec;转座因子的发现和分类 &#x1f9ec;转座因子的概念 转座因子(transposable element)是在转座酶&#xff08;transposase&#xf…

Class 03 - R语言的 Vectors(向量) 与 lists(列表)

Class 03 - R语言的 Vector与 列表 list R语言语法脚本文件的创建、保存、和修改名称第一个函数使用帮助功能查看函数详细说明语法问题变量与赋值定义变量名称格式调用变量 R中的数据结构Vectors (向量)创建向量查看向量的性质查看数据类型 typeof()查看数据长度 length()检查…

Elasticsearch 核心技术(十):GEO 地理查询(geo_bounding_box、geo_distance、geo_shape)

❤️ 博客主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录 一、地理数据类型1.1、geo_point 地理点类型1.1.1、创建一个含有 geo_point 字…

opencv_c++学习(八)

一、两张图像的像素比较 比较最大最小 最小&#xff1a; min(lnputArray src1, InputArray src2, outputArray dst)最大&#xff1a; max(lnputArray src1, InputArray src2, outputArray dst)src1 :第一个图像矩阵&#xff0c;可以是任意通道数的矩阵。 src2:第二个图像矩…

电源电压过冲

前言&#xff1a; 前段时间突然想起来以前的一个问题&#xff0c;这个问题相信大家也都遇到过&#xff0c;甚至是解决过&#xff0c;或者没解决&#xff0c;也就不了了之&#xff0c;今天这篇文章&#xff0c;主要来讲下这个问题&#xff0c;看完喜欢的欢迎给我留言或者点赞&a…

【Linux】常见指令

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C专栏&#xff1a;Linux修炼内功基地 家人们更新不易&#xff0c;你们的&#x1f44d;点赞&#x1f44d;和⭐关注⭐…

EasyYapi插件—快速生成API接口文档

EasyYapi插件—快速生成API接口文档 1. 功能 导出http到&#xff08;Controller注解类&#xff09; YapiPostmanmarkdown导出RPC到 YapimarkdownCall api调用API接口 注意点&#xff1a; 注释中可以使用module标注模块所属的模块。表示接口会发布到yapi模块下&#xff1b;只…