部门人力分配 - 华为OD统一考试

news2024/11/18 0:15:52

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

部门在进行需求开发时需要进行人力安排。当前部门需要完成 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

输出描述

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

示例1

输入:
3
3 5 3 4

输出:
6

说明:
输入数据两行,第一行输入数据 3 表示开发时间要求,第二行输入数据表示需求工作量大小,输出数据一行,表示部门人力需求。 
当选择人力为6时,2个需求量为3的工作可以在1个月里完成,其他2个工作各需要1个月完成。可以在3个月内完成所有需求。 
当选择人力为5时,4个工作各需要1个月完成,一共需要4个月才能完成所有需求。 
因此6是部门最小的人力需求。

题解

这是一个二分算法 + 贪心的题目。题目要求在 M 个月内完成 N 个需求,每个月最多完成 2 个需求,且每个月需要完成的需求不能超过部门人力。我们需要求解每个月所需的最小人力,以满足需求开发进度。

解题思路:

  1. 对需求的工作量进行排序。
  2. 使用二分查找确定每个月所需的最小人力。
  3. 在二分查找的过程中,通过贪心策略,尽可能每个月完成 2 个需求,从而在 M 个月内完成尽量多的需求。
  4. 如果当前人力能够满足在 M 个月内完成所有需求,则减小人力;否则增大人力。

Java

import java.util.Arrays;
import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {

    // 判断每个月需要的最小人力 power ,能否在 M 个月内完成开发
    public static boolean check(int[] requirements, long power, int M) {
        int months = 0;
        int l = 0, r = requirements.length - 1;
        while (l <= r) {
            // 【贪心】如果每个月可以完成 2 个则完成 2 个
            if (requirements[l]  <= power - requirements[r]) {
                l++;
            }
            r--;
            months++;
        }

        return months <= M;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int M = Integer.parseInt(in.nextLine());
        int[] requirements = Arrays.stream(in.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();
        Arrays.sort(requirements);
		
        // 由于每个月需要完成的需求不能超过部门人力, 因此最小的部门人力为 max(requirements)
        long l = Arrays.stream(requirements).max().getAsInt() - 1;
        long r = Arrays.stream(requirements).asLongStream().sum();

        while (l + 1 < r) {
            long mid = (l + r) / 2;
            if (check(requirements, mid, M)) {
                r = mid;
            } else {
                l = mid;
            }
        }
        System.out.println(r);
    }
}

Python

from typing import List


def check(requirements: List[int], power: int) -> bool:
    """判断每个月需要的最小人力 power ,能否在 M 个月内完成开发"""
    global M
    months = 0
    l, r = 0, len(requirements) - 1
    while l <= r:
        if requirements[l] <= power - requirements[r]: # 【贪心】如果每个月可以完成 2 个则完成2个
            l += 1
        r -= 1
        months += 1

    return months <= M


if __name__ == '__main__':
    M = int(input())
    requirements = list(map(int, input().split()))
    requirements.sort()
    l, r = max(requirements) - 1, sum(requirements)
    while l + 1 < r:
        mid = (l + r) // 2
        if check(requirements, mid):
            r = mid
        else:
            l = mid

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

int M;

// 判断每个月需要的最小人力 power ,能否在 M 个月内完成开发
bool check(vector<int>& requirements, long long power) {
    int months = 0;
    int l = 0, r = requirements.size() - 1;
    while (l <= r) {
        // 【贪心】如果每个月可以完成 2 个则完成 2 个
        if (requirements[l] <= power - requirements[r]) {
            l++;
        }
        r--;
        months++;
    }

    return months <= M;
}

int main() {
    cin >> M;

    vector<int> requirements;
    int requirement;
    while (cin >> requirement) {
        requirements.push_back(requirement);
    }

    sort(requirements.begin(), requirements.end());

    long long l = *max_element(requirements.begin(), requirements.end()) - 1;
    long long r = accumulate(requirements.begin(), requirements.end(), 0LL);

    while (l + 1 < r) {
        long mid = (l + r) / 2;
        if (check(requirements, mid)) {
            r = mid;
        } else {
            l = mid;
        }
    }

    cout << r << endl;

    return 0;
}

相关练习题

题号题目难易
LeetCode 16311631. 最小体力消耗路径中等
LeetCode 22262226. 每个小孩最多能分到多少糖果中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Turbo编码原理

目录 Turbo码&#xff1a;无线通信中的革命性技术 引言 一、Turbo码的基本原理 1.1 卷积码基础&#xff1a; 1.2 Turbo码的构造&#xff1a; 1.2.1 分量编码器 1.2.2 随机交织器 1.2.3 穿刺和复接单元 1.3 编码器结构的重要性和影响 1.4 迭代解码&#xff1a; 1.4.1 …

HiveQL——不借助任何外表,产生连续数值

注&#xff1a;参考文章&#xff1a; HiveSql一天一个小技巧&#xff1a;如何不借助其他任何外表&#xff0c;产生连续数值_hive生成连续数字-CSDN博客文章浏览阅读1.3k次。0 需求描述输出结果如下所示&#xff1a;12345...1001 问题分析方法一&#xff1a;起始值&#xff08;…

C++模版(初阶)

&#x1f308;函数复用的两种不恰当方式 ☀️1.函数重载 以Swap函数为例&#xff0c;有多少种参数类型组合&#xff0c;就要重载多少个函数&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left,…

[职场] 俄语业务员是做什么的 #职场发展#媒体

俄语业务员是做什么的 俄语业务员作为我国企业开展对俄贸易的重要人才&#xff0c;他们需要不断提高自身的专业技能和综合素质&#xff0c;以适应不断变化的市场环境和企业发展需求&#xff0c;为中俄两国经贸合作做出更大的贡献。 一、俄语业务员是什么 俄语业务员是指以俄语…

SpringBoot全局异常捕获处理实现方案

在Spring Boot中实现全局异常处理可以通过以下方式&#xff1a; 使用ControllerAdvice注释创建一个全局异常处理类&#xff0c;并使用ExceptionHandler注释来定义具体异常的处理方法。 import your.package.IllegalNumberException; import org.springframework.http.HttpSta…

【数据结构】链表OJ面试题5(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

3D裸眼技术行业研究:2026年市场投资规模为10.78亿元

3D裸眼技术大多处于研发阶段&#xff0c;它的研发分两个方向&#xff0c;一是硬件设备的研发&#xff0c;二为显示内容的处理研发。第二种已经开始小范围的商业运用。大众消费者接触的不多。从技术上来看&#xff0c;3D裸眼可分为光屏障式(Barrier)、柱状透镜(Lenticular Lens)…

4核8g服务器能支持多少人访问?- 腾讯云

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

多源异构数据融合是为了解决什么问题?

多源异构数据融合为了解决在数据处理和分析过程中&#xff0c;由于数据来源的多样性和数据结构的差异性所带来的问题。具体来说&#xff0c;多源异构数据主要解决以下几个方面的问题&#xff1a; 数据来源多样性&#xff1a;在实际应用中&#xff0c;数据可能来自不同的来源&am…

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…

全局唯一id生成器 各种实现记录

全局唯一id生成器 Redis 生成 前提知识~~ 时间戳 时间戳这个东西我们老是听到,却可能不是特别了解 首先,时间戳是从1970年1月1号0点0分开始的秒数,我查了蛮多资料,理论上来说,时间戳是没有上限的,而我们一般用位数来限制这里的上限,比如32位 我们来实际计算一下 32位的二进…

Leecode之分割链表

一.题目及剖析 https://leetcode.cn/problems/partition-list-lcci/description/ 二.思路引入 就是将其分成大小两个链表,以x为分界线进行分堆,最后再将两链表合并 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct Lis…

陪护系统|陪护小程序提升长者护理服务质量的关键

在如今逐渐老龄化的社会中&#xff0c;老年人对更好的护理服务需求不断增加。科技的进步使得陪护小程序系统源码成为提供优质服务的重要途径之一。本文将从运营角度探讨如何优化陪护小程序系统源码&#xff0c;提升长者护理服务的质量。 首先&#xff0c;我们需要对软件的设计和…

CAN通讯协议详解

阅读引言&#xff1a; 本篇博文想给需要的人介绍一下CAN总线&#xff0c; 这个也算是我从B站学习记得笔记分享吧也算是。简单的介绍了CAN总线的大致内容&#xff0c; 简述支持CAN功能的STM32的简单使用例程。本视频的中的图片内容均来自B站爱上半导体博主的内容。 CAN高质量教学…

AI嵌入式K210项目(28)-在线模型训练

文章目录 前言一、平台介绍二、创建项目三、上传数据集图像分类图像检测图片上传压缩包上传 四、新建任务总结 前言 前面我们使用已经训练好的模型在K210开发板上进行了人脸识别&#xff0c;口罩识别&#xff0c;手写数字识别等实验&#xff0c;那么模型除了使用已经训练好的&…

【Make编译控制 01】程序编译与执行

目录 一、编译原理概述 二、编译过程分析 三、编译动静态库 四、执行过程分析 一、编译原理概述 make&#xff1a; 一个GCC工具程序&#xff0c;它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接&#xff0c;然后发布必要的命令。它读出的脚本&#xff08;叫做 …

机器学习2--逻辑回归(案列)

糖尿病数据线性回归预测 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_diabetes diabetesload_diabetes() datadiabetes[data] targetdiabetes[target] feature_namesdiabetes[feature_names] data.shape df …

【数据结构】双向链表(链表实现+测试+原码)

前言 在双向链表之前&#xff0c;如果需要查看单链表来复习一下&#xff0c;链接在这里&#xff1a; http://t.csdnimg.cn/Ib5qS 1.双向链表 1.1 链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1.1.1 单向或者双向 1.1.2 …

leetcode——滑动窗口题目汇总

本章总结一下滑动窗口的解题思路&#xff1a; 在字符串中使用双指针 left 和 right 围成的一个左闭右开的区域作为一个窗口。不断将 right 向右滑动&#xff0c;直到窗口中的字符串符合条件。此时将 left 向右滑动&#xff0c;直到窗口中的字符串不符合条件&#xff0c;期间需…