华为OD机试 - 用户调度问题(Java 2023 B卷 100分)-LMLPHP

专栏导读

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

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

一、题目描述

在通信系统中,一个常见的问题是对用户进行不同策略的调度,会得到不同的系统消耗和性能。

假设当前有n个待串行调度用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。请你根据如下规则进行用户调度,并返回总的消耗资源数。

规则:

  1. 相邻的用户不能使用相同的调度策略,例如,第1个用户使用了A策略,则第2个用户只能使用B或者C策略。
  2. 对单个用户而言,不同的调度策略对系统资源的消耗可以归一化后抽象为数值。例如,某用户分别使用A/B/C策略的系统消耗分别为15/8/17。
  3. 每个用户依次选择当前所能选择的对系统资源消耗最少的策略(局部最优),如果有多个满足要求的策略,选最后一个。

二、输入描述

第一行表示用户个数n。

接下来每一行表示一个用户分别使用三个策略的系统消耗。

三、输出描述

最优策略组合下的总的系统资源消耗数。

四、解题思路

1、核心思想:

  1. 每个用户依次选择当前所能选择的对系统资源消耗最少的策略;
  2. 相邻的用户不能使用相同的调度策略

2、说人话:

  1. 选择每一行最小的值;
  2. 并且不能选择和上一行策略相同的那个数

这就简单了。

选择第一行最小的数,计算下一行“最小数”的时候,不能考虑和前一行策略相同的那个数。

五、Java算法源码

package com.guor.od;

import java.util.*;

/**
 * 1、相邻的用户不能使用相同的调度策略(共三种)
 * 2、每个用户依次选择当前所能选择的对系统资源消耗最少的策略
 */
public class OdTest03 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 用户个数n
        int n = Integer.parseInt(sc.nextLine());
        // 满足条件的最小值之和
        int sum = 0;
        // 前一行最小值下角标
        int preMinIndex = -1;
        for (int i = 0; i < n; i++) {
            // 三种不同的调度策略值
            int[] line = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
            // 当前行的最小值
            int min = Integer.MAX_VALUE;
            // 当前行最小值下角标
            int minIndex = -1;
            // 遍历三种不同的调度策略值
            for (int j = 0; j < line.length; j++) {
                // 取当前行的最小值,最小值的下角标不等于上一行最小值的下角标
                if (line[j] < min && preMinIndex != j) {
                    min = line[j];
                    // 当前行"最小值"下角标
                    minIndex = j;
                }
            }
            // 更新上一行最小值的下角标
            preMinIndex = minIndex;
            System.out.println(min);
            // 满足条件的最小值之和
            sum += min;
        }
        // 输出满足条件的最小值之和
        System.out.println(sum);
    }
}

六、效果展示

1、输入

5
15 12 9
26 17 12
9 7 8
10 12 15
10 15 20

2、输出

59

3、说明

  • 1号用户使用C策略9;
  • 2号用户使用B策略17;
  • 3号用户使用C策略8;
  • 4号用户使用A策略10;
  • 5号用户使用B策略15;
  • 9 + 17 + 8 + 10 + 15 = 59

故输出59

华为OD机试 - 用户调度问题(Java 2023 B卷 100分)-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

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

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

华为OD机试 - 用户调度问题(Java 2023 B卷 100分)-LMLPHP

08-17 17:46