华为OD机试 - 部门人力分配 - 二分查找(Java 2024 D卷 200分)

在这里插入图片描述

华为OD机试 2024D卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

部门在进行需求开发时需要进行人力安排。当前部门需要完成 N 个需求,需求用 requirements[i] 表示,requirements[i] 表示第 i 个需求的工作量大小,单位:人月。这部分需求需要在 M 个月内完成开发,进行人力安排后每个月的人力是固定的。

目前要求每个月最多有 2 个需求开发,并且每个月需要完成的需求不能超过部门人力。请帮部门评估在满足需求开发进度的情况下,每个月需要的最小人力是多少?

二、输入描述

输入第一行为 M ,第二行为 requirements 。

M 表示需要开发时间要求,requirements 表示每个需求工作量大小

N 为 requirements 长度,1 ≤ N / 2 ≤ M ≤ N ≤ 10000,1 ≤ requirements[i]≤ 10^9

三、输出描述

对于每一组测试数据,输出部门需要人力需求,行末无多余的空格。

四、解题思路

本题要求我们在给定的开发时间(以月份为单位)内完成一系列需求开发,每个月最多完成2个需求,并且每个月需要的总人力(工作量)不能超过一个固定值。目标是找到每个月需要的最小人力。

为了实现这一目标,我们可以使用二分查找和贪心算法相结合的策略:

  1. 确定二分查找的范围:
    • 最小值 minCapacity:为单个需求的最大工作量,因为至少需要满足最重的需求。
    • 最大值 maxCapacity:为两个最重需求的工作量之和,这是最极端的情况下的最大人力需求。
  2. 二分查找:
    • 通过二分查找的方法,在 minCapacity 和 maxCapacity 之间找到最小的每月人力需求。
    • 每次取中间值 midCapacity,检查在这个人力值下是否可以在规定的 months 内完成所有需求。
    • 如果可以,说明当前人力值可能是一个解,但需要尝试更小的值以找到最优解;如果不可以,说明当前人力值太小,需要增加人力值。
  3. 检查可行性:
    • 使用贪心算法检查在给定的每月人力值下是否可以在规定的 months 内完成所有需求。
    • 从工作量最小的需求和工作量最大的需求开始,尽量将两个需求安排在同一个月内。如果不能,就安排一个需求。
    • 记录需要的月份数,并与规定的 months 进行比较。

五、Java算法源码

public class Test01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取开发时间要求的月份数
        int months = Integer.parseInt(scanner.nextLine());

        // 读取每个需求的工作量,并转换为整数数组
        int[] workload = Arrays.stream(scanner.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        // 输出计算得到的最小人力需求
        System.out.println(calculateMinManpower(months, workload));
    }

    /**
     * 计算满足开发进度的最小人力需求
     * @param months 需要开发的总月份数
     * @param workload 每个需求的工作量数组
     * @return 最小人力需求
     */
    public static long calculateMinManpower(int months, int[] workload) {
        Arrays.sort(workload); // 将需求工作量数组进行排序
        int numOfTasks = workload.length; // 获取需求的总数量

        // 如果只有一个需求,则返回该需求的工作量
        if (numOfTasks == 1) {
            return workload[0];
        }

        // 初始化二分查找的最小值和最大值
        long minCapacity = workload[numOfTasks - 1]; // 最小人力需求为最大工作量
        long maxCapacity = workload[numOfTasks - 2] + workload[numOfTasks - 1]; // 最大人力需求为最大的两个工作量之和
        long optimalCapacity = maxCapacity; // 初始最优人力需求设为最大值

        // 进行二分查找
        while (minCapacity <= maxCapacity) {
            long midCapacity = (minCapacity + maxCapacity) >> 1; // 计算中间值

            // 检查在当前中间值下是否能在规定月份内完成所有需求
            if (canCompleteWithinMonths(midCapacity, months, workload)) {
                optimalCapacity = midCapacity; // 更新最优人力需求
                maxCapacity = midCapacity - 1; // 尝试更小的值
            } else {
                minCapacity = midCapacity + 1; // 尝试更大的值
            }
        }

        return optimalCapacity; // 返回计算得到的最优人力需求
    }

    /**
     * 检查是否可以在给定的月份内完成所有需求
     * @param capacity 每个月的最大工作量
     * @param months 总月份数
     * @param workload 每个需求的工作量数组
     * @return 是否可以在给定的月份内完成所有需求
     */
    public static boolean canCompleteWithinMonths(long capacity, int months, int[] workload) {
        int left = 0; // 指向工作量最小的需求
        int right = workload.length - 1; // 指向工作量最大的需求
        int requiredMonths = 0; // 记录需要的月份数

        // 遍历需求,尝试将两个需求放在同一个月份内完成
        while (left <= right) {
            if (workload[left] + workload[right] <= capacity) {
                left++; // 如果最小需求和最大需求可以一起完成,则移动左指针
            }
            right--; // 总是移动右指针
            requiredMonths++; // 增加需要的月份数
        }

        return months >= requiredMonths; // 判断给定的月份是否足够
    }
}

六、效果展示

1、输入

3
3 5 3 4

2、输出

6

3、说明

输入数据两行,第一行输入数据 3 表示开发时间要求,第二行输入数据表示需求工作量大小,输出数据一行,表示部门人力需求。

当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。

当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。

因此6是部门最小的人力需求。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis-实战篇(8)达人探店

8、达人探店 8.1、达人探店-发布探店笔记 发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等 tb_blog_comments&#xff1a;其他用户对探店笔记的…

最新PHP仿猪八戒任务威客网整站源码/在线接任务网站源码

资源介绍 老规矩&#xff0c;截图为亲测&#xff0c;前后台显示正常&#xff0c;细节功能未测&#xff0c;有兴趣的自己下载。 PHP仿猪八戒整站源码下载&#xff0c;phpmysql环境。威客开源建站系统&#xff0c;其主要交易对象是以用户为主的技能、经验、时间和智慧型商品。经…

上海亚商投顾:创业板指低开低走 先进封装概念午后走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量震荡调整&#xff0c;深成指、创业板指跌超1%。车路云概念延续强势&#xff0c;长江通信4连板&am…

LVGL开发教程-FreeRTOS中的LVGL

系列文章目录 知不足而奋进 望远山而前行 目录 系列文章目录 文章目录 前言 重要步骤 lv_tick_inc(x) lv_timer_handler() 1. 声明一把锁 2. 初始化这把锁 3. 创建一个任务 4. 编写任务的内容 完整示例代码 总结 前言 在嵌入式系统开发中&#xff0c;使用LVGL&…

Docker定位具体占用大量存储的容器

监控告警生产环境的服务器磁盘分区使用率大于90%&#xff0c;进入服务器查看Docker 的 overlay2 存储驱动目录中占用很大&#xff0c;很可能是某个容器一直在打印日志&#xff0c;所以需要定位到是哪个容器&#xff0c;然后进行进一步排查。 然后进入到overlay2中查看是哪个目录…

优化改进YOLOv5算法之Shift-ConvNets,具有大核效应的小卷积核,效果提升明显

目录 1 Shift-ConvNets模块原理 1.1 Decomposition and Combination of Convolution 1.2 Sparse Dependencies of Large Convolution Kernels 1.3 Intermodule Feature Manipulation 2 YOLOv5中加入Shift-ConvNets模块 2.1 common.py文件配置 2.2 yolo.py配置 2.3 创建…

【Spine学习13】之 制作受击动画思路总结(叠加颜色特效发光效果)

绑定IK腿部骨骼容易出错的一种方式&#xff0c; 要记住 如果按照错误方式绑定骨骼&#xff0c;可能移动IK约束的时候会另腿部的弯曲方向相反了 &#xff1a; 上节分享了攻击动作的制作思路总结&#xff0c; 这节总结受击思路。 第一步&#xff1a; 创建一个新的动画&#xff1…

专业140+总分400+武汉理工大学855信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

专业855信号与系统140&#xff0c;总分400&#xff0c;今年顺利上岸武汉理工大学&#xff0c;总结一下自己的复习经历&#xff0c;希望对报考武理工的同学有所帮助。专业课&#xff1a;855信号与系统 首先教材&#xff1a; 《信号与系统》高等教育出版社 作者&#xff1a;刘泉…

Vue65-vue-resource:ajax请求

vue-resource是vue的插件库&#xff0c;用vue.use(xxxx)使用插件。 1、安装 2、引入和使用 这个库&#xff0c;维护的频率不高了。还是建议使用&#xff1a;axios&#xff0c;vue-resource只是了解即可。

1969python房屋租赁管理系统mysql数据库Flask结构BootStrap布局计算机软件工程网页

一、源码特点 python Flask房屋租赁管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 python flask 房屋租赁管理系统 开发环境pycharm mysql …

大模型的下一站:AI Agent!

前言 现在各家基本上都有自己的大模型产品&#xff0c;现在的重点都是在找商业模式&#xff0c;以及扩展大模型的应用场景上。所以大家做APP、做Copilot也就不足为奇&#xff0c;都是为自己找出路的做法。但从作者的角度&#xff0c;Copilot只是传统互联网应用到大模型应用的过…

汇凯金业:现货黄金技术分析及其应用

现货黄金技术分析是一种通过市场价、量、时、空间四个元素的研究&#xff0c;利用图表表达数据&#xff0c;从而预测未来价格走向的方法。虽然技术分析并非完美无缺&#xff0c;但它在投资决策中起到了重要作用。以下是现货黄金技术分析的详细介绍及其应用方法。 技术分析的基…

1分钟告诉你电脑微信文件夹储存在什么位置!

在日常生活中&#xff0c;微信已经成为我们不可或缺的社交工具之一&#xff0c;我们使用它来与亲朋好友保持联系&#xff0c;分享生活中的点滴。然而&#xff0c;随着我们在微信中发送和接收越来越多的信息、图片、视频等内容&#xff0c;微信所占用的存储空间也逐渐增加。 因…

做一个架构师需要什么能力?

作为一个架构师&#xff0c;需要具备多方面的能力来确保项目的顺利进行和系统的成功设计。以下是架构师所需的主要能力&#xff0c;按照不同的类别进行归纳和分点表示&#xff1a; 技术能力 编程能力&#xff1a;架构师通常是一个开发团队中技术较为出色的人员之一&#xff0…

转型技术管理:九大步骤解锁高效管理新境界

文章目录 引言一、寻求反馈二、从员工的角度看待问题三、总览全局四、管理自己的情绪五、赞赏员工的出色工作六、在人前支持员工七、管理自己的职业生涯八、认识到自己也许存在偏见&#xff0c;与不同于自己的人交流九、在工作中建立信任和沟通总结 引言 在快速变化的科技浪潮…

短视频开源项目MoneyPrinterTurbo:AI副业搞起来,视频制作更轻松!

目录 引言一、MoneyPrinterTurbo简介二、MoneyPrinterTurbo的核心功能三、MoneyPrinterTurbo的未来发展四、MoneyPrinterTurbo与AI副业五、部署实践1、克隆代码2、创建虚拟环境3、安装依赖4、安装好 ImageMagick5、端口映射6、启动Web界面7、模型配置8、填写主题9、视频生成10、…

Linux系统中的权限

在Linux系统中&#xff0c;权限是确保文件和目录安全性的关键机制。理解Linux权限对于有效管理和保护系统至关重要。本文将深入探讨Linux权限的概念、分类、设置方法以及实际应用&#xff0c;帮助读者更好地理解和运用这一关键技术。 一、Linux权限概述 Linux权限主要涉及三个…

前端路线指导(1):前端学习路线

小粉前端学习路线&#xff08;前言&#xff09; 哈喽大家好&#xff01;我是小粉&#xff0c;双一流本科&#xff0c;自学前端一年&#xff0c;收获腾讯&#xff0c;字节等9家互联网大厂offer&#xff0c;秋招面试通过率100%&#xff0c;其中半数offer为ssp&#xff08;薪资最高…

打造智能环境监测系统:全面解析Arduino Uno引脚与芯片功能!

Arduino Uno 是一个非常流行的微控制器开发板&#xff0c;广泛用于各种物联网项目。理解每个引脚的功能对于充分利用 Arduino Uno 的能力至关重要。本文将详细介绍 Arduino Uno 的每个引脚的功能、芯片功能&#xff0c;并通过表格、流程图和其他图表来帮助理解。 Arduino Uno 引…

机器学习课程复习——集成学习

1. 基本概念 1.1. 定义 通过构建并结合多个个体学习器来完成学习任务,获得比单一学习器显著优越的泛化性能。 1.2. 分类 名称个体学习器例子同质集成基学习器Boosting、Bagging异质集成组件学习器Stacking1.3. 研究的核心 个体学习器的“准确性”和“多样性”本身就存在冲…