华为OD机试 - 流水线 - 逻辑分析(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

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

专栏导读

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

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

一、题目描述

一个工厂有 m 条流水线,来并行完成 n 个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业。现给定流水线个数 m,需要完成的作业数 n,每个作业的处理时间分别为 t1.t2…tn。请你

编程计算处理完所有作业的耗时为多少?

当 n>m 时,首先处理时间短的 m 个作业进入流水线,其他的等待,当某个作业完成时,依次从剩余作业中取处理时间最短的进入处理。

二、输入描述

第一行为2 个整数 (采用空格分隔),分别表示流水线个数 m 和作业数 n;

第二行输入 n个整数 (采用空格分隔) ,表示每个作业的处理时长 t1,t2…tn。

0< m,n<100,0

注:保证输入都是合法的

三、输出描述

输出处理完所有作业的总时长。

1、输入

3 5
8 4 3 2 10

2、输出

13

3、说明

  1. 先安排时间为2、3、4的三个作业;
  2. 第一条流水线先完成作业,然后调度剩余时间最短的作业8;
  3. 第二条流水线完成作业,然后调度剩余时间最短的作业10;
  4. 总耗时就是第二条流水线完成作业的时间

四、解题思路

  1. 将每个作业的处理时长有小到大排序;
  2. 每条流水线依次处理时长小的作业,其它的作业等待;
  3. 当第一条作业完成后,再完成剩余的作业中处理时间最小的作业;
  4. 依次类推;
  5. 总耗时就是最后一个作业所对应的流水线的总耗时。

五、Java算法源码

package com.guor.od;

import java.util.*;

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

        int[] line = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 流水线个数 m
        int m = line[0];
        // 作业数 n
        int n = line[1];

        // 每个作业的处理时长
        int[] timeArr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        // 有小到大排序
        Arrays.sort(timeArr);

        /**
         * 特殊情况:
         * 流水线 大于等于 独立的作业时,可以直接处理,不需要等待排队
         * 直接返回独立作业最长的处理时间即可
         */
        if (m >= n) {
            System.out.println(timeArr[timeArr.length - 1]);
            return;
        }

        // 当 n>m 时,首先处理时间短的 m 个作业进入流水线,其他的等待
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < timeArr.length; i++) {
            // m条流水线同时处理作业
            int key = i % m;
            map.put(key, map.getOrDefault(key, 0) + timeArr[i]);
        }

        // 处理完所有作业的总时长
        int sum = 0;
        for (Integer value : map.values()) {
            sum = Math.max(sum, value);
        }
        // 输出处理完所有作业的总时长
        System.out.println(sum);
    }
}

六、效果展示

1、输入

4 6
10 20 15 12 8 9

2、输出

29

3、说明

  • 10 20 15 12 8 9从小到大排序,8 9 10 12 15 20
  • 一共4条流水线,先完成8 9 10 12;
  • 第一条流水线先完成作业,然后调度剩余时间最短的作业15;
  • 第二条流水线完成作业,然后调度剩余时间最短的作业20;
  • 总耗时就是第二条流水线完成作业的时间29。

华为OD机试 - 流水线 - 逻辑分析(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

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

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

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,开发语言)