OD_2024_C卷_200分_10、部门人力分配【JAVA】【二分法 + 双指针】

news/2024/5/19 7:59:32 标签: java, 开发语言, OD

在这里插入图片描述

说明

输入数据两行,

第一行输入数据3表示开发时间要求,

第二行输入数据表示需求工作量大小,

输出数据一行,表示部门人力需求。

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

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

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

代码

java">package odjava;

import java.util.Arrays;
import java.util.Scanner;

public class 十_部门人力分配 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int m = Integer.parseInt(sc.nextLine());
        int[] requirements = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        System.out.println(getResult(m, requirements));
    }

    public static long getResult(int m, int[] requirements) {
        Arrays.sort(requirements);

        int n = requirements.length;

        // 每辆自行车的限重 至少是 最重的那个人的体重
        long min = requirements[n - 1];
        // 每辆自行车的限重 至多是 最重的和次重的那两个的体重
        long max = requirements[n - 2] + requirements[n - 1];

        long ans = max;

        // 二分取中间值
        while (min <= max) {
            long mid = (min + max) >> 1; // 需要注意的是,min,max单独看都不超过int,但是二者相加会超过int,因此需要用long类型

            if (check(mid, m, requirements)) {
                // 如果mid限重,可以满足m辆车带走n个人,则mid就是一个可能解,但不一定是最优解
                ans = mid;
                // 继续尝试更小的限重,即缩小右边界
                max = mid - 1;
            } else {
                // 如果mid限重,不能满足m辆车带走n个人,则mid限重小了,我们应该尝试更大的限重,即扩大左边界
                min = mid + 1;
            }
        }

        return ans;
    }

    /**
     * @param limit        每辆自行车的限重
     * @param m            m辆自行车
     * @param requirements n个人的体重数组
     * @return m辆自行车,每辆限重limit的情况下,能否带走n个人
     */
    public static boolean check(long limit, int m, int[] requirements) {
        int l = 0; // 指向体重最轻的人
        int r = requirements.length - 1; // 指向体重最重的人

        // 需要的自行车数量
        int need = 0;

        while (l <= r) {
            // 如果最轻的人和最重的人可以共享一辆车,则l++,r--,
            // 否则最重的人只能单独坐一辆车,即仅r--
            if (requirements[l] + requirements[r] <= limit) {
                l++;
            }
            r--;
            // 用掉一辆车
            need++;
        }

        // 如果m >= need,当前有的自行车数量足够
        return m >= need;
    }
}

http://www.niftyadmin.cn/n/5420990.html

相关文章

xargs命令详解——将标准输入转为命令行参数

xargs命令的作用,是将标准输入转为命令行参数。 [root@localhost ~]# echo "hello word" |echo[root@localhost ~]# echo "hello word" |xargs echo hello word上面的代码将管道左侧的标准输入,转为命令行参数hello world,传给第二个echo命令。如果不用…

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…

Docker 的常用命令介绍使用

1. docker pull <image_name> 作用&#xff1a;从 Docker Hub 下载指定镜像到本地示例&#xff1a;docker pull ubuntu 2. docker run -it <image_name> 作用&#xff1a;启动一个新容器并进入交互模式示例&#xff1a;docker run -it ubuntu 3. docker ps 作…

Unity Timeline在编辑器下正常,真机(模拟器、手机)不正常播放问题

出现这个问题很大可能是因为设置了 Managed Stripping Level > Low 只需要改成 Managed Stripping Level > Medium就可以正常播 或者改Assets/link.xml没有就新建 <linker><assembly fullname"Unity.Timeline" preserve"all" /> </l…

AI安全白皮书 | “深度伪造”产业链调查以及四类防御措施

以下内容&#xff0c;摘编自顶象防御云业务安全情报中心正在制作的《“深度伪造”视频识别与防御白皮书》&#xff0c;对“深度伪造”感兴趣的网友&#xff0c;可在文章留言中写下邮箱&#xff0c;在该白皮书完成后&#xff0c;会为您免费寄送一份电子版。 “深度伪造”就是创建…

安装配置Spark集群

安装Spark集群主要包括以下步骤&#xff1a; 1、下载Spark安装包&#xff0c;在各节点中安装部署spark集群 2、配置整合 3、启动并测试 下载Spark 可以从官方网站下载合适的版本。当前环境已经提供了安装包&#xff0c;存放在 /opt/software目录下。 在node1节点上安装Sp…

祝贺3月10日PMP项目管理认证考试成功举行!

3月10日&#xff0c;项目管理资格认证考试顺利举行&#xff01; 这是2024年度首场项目管理资格认证考试&#xff0c;此次考试的顺利举行&#xff0c;既满足了不断回暖的市场对专业项目管理人才的巨大需求&#xff0c;也为构建新经济发展格局注入了项目管理的强大动能。 在全球…

2024年华为OD机试真题- 项目排期-Python-OD统一考试(C卷)

题目描述: 项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。 输入描述: 第一行…