【华为OD机考真题】- 用户调度问题(Java)

1. 题目描述

题目: 在通信系统中,一个常见的问题是对用户进行不同策略的调度,会得到不同的系统消耗和 性能。假设当前有n个待串行调度用户,每个用户可以使用 A/B/C 三种不同的调度策略,不同的策略会消耗不同的系统资源。请你根据如下规则进行用户调度,并返回总的消耗资源数。

规则:

1、相邻的用户不能使用相同的调度策略,例如,第1个用户使用了 A策略,则第2 个用户只能使用 B或者 C 策略.

2、对单个用户而言,不同的调度策略对系统资源的消耗可以归一化后抽象为数值。例如,某用户分别使用 A/B/C 策略的系统消耗分别为 15/8/17。

3、每个用户依次选择当前所能选择的对系统盗源消耗最少的策略(局部最优),如果有多个满足要求的策略,选最后一个。

2. 输入描述

第一行表示用户个数 n,接下来每一行表示一个用户分别使用三个策略的系统消耗 resA、resB、resC。

3. 输出描述

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

4. 示例演示

4.1 示例1

输入:

复制代码
3
15 8 17
12 20 9
11 7 5

输出:

复制代码
24

示例说明: 1号用户使用 B策略,2号用户使用C策略,3号用户使用B策略。系统资源消耗:8+9+7=24。

备注: 所有策略对系统的资源消耗均为正整数,n<1000。

4.2 示例2

输入:

复制代码
3
1 2 3
4 5 6
7 8 9

输出:

复制代码
13

Java代码

java 复制代码
package odTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class clientDispatcher {
	static List<Integer> optList = new ArrayList<>();
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int num = Integer.parseInt(scanner.nextLine());
		
		int[][] systemRes = new int[num][3];
		for(int i=0;i<num;i++) {
			int[] input = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
			for(int j=0;j<num;j++) {
				systemRes[i][j] = input[j];
			}
		}
		choiceOptimiseGroup(systemRes,-1,num,0,0);
		Collections.sort(optList, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				if(o1>o2) {
					return 1; 
				}
				if(o1 == o2) {
					return 1;
				}
				return -1;
			}
		});
		System.out.println(optList.get(0));
		
	}

	private static void choiceOptimiseGroup(int[][] systemRes, int preStrategy,int num, int currentClient, int sum) {
		if(currentClient==num) {
			optList.add(sum);
			return;
		}
		for(int i=0;i<3;i++) {
			if(i==preStrategy) {
				continue;
			}
			sum = sum+systemRes[currentClient][i];
			choiceOptimiseGroup(systemRes,i,num,currentClient+1,sum);
			sum = sum-systemRes[currentClient][i];
		}
		
	}

}
相关推荐
什码情况1 天前
星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)
java·数据结构·算法·华为od·面试·机试
python算法(魔法师版)1 天前
.NET 在鸿蒙系统上的适配现状
华为od·华为·华为云·.net·wpf·harmonyos
懒懒小徐3 天前
2023华为od统一考试B卷【二叉树中序遍历】
数据结构·算法·华为od
纪元A梦6 天前
华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od·go
懒懒小徐9 天前
2023华为od机试C卷【跳格子3】
java·华为od·动态规划
纪元A梦10 天前
华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od
懒懒小徐11 天前
华为OD机试真题 Java 实现【水库蓄水问题】
java·算法·华为od·双指针
纪元A梦12 天前
华为OD机试真题——斗地主之顺子(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od
纪元A梦15 天前
华为OD机试真题——阿里巴巴找黄金宝箱Ⅰ(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
java·c语言·javascript·c++·python·华为od·go
纪元A梦17 天前
华为OD机试真题——绘图机器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳实现
java·javascript·c++·python·华为od·go·华为od机试题