【华为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];
		}
		
	}

}
相关推荐
纪元A梦3 天前
华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·c语言·javascript·c++·python·华为od·go
rigidwill6663 天前
华为机试—最大最小路
数据结构·c++·算法·华为od·华为·职场和发展·并查集
什码情况6 天前
整数编码 - 华为OD统一考试(A卷、C++)
数据结构·c++·算法·华为od
纪元A梦6 天前
华为OD全流程解析+备考攻略+经验分享
经验分享·华为od
什码情况11 天前
微服务集成测试 -华为OD机试真题(A卷、JavaScript)
javascript·数据结构·算法·华为od·机试
什码情况16 天前
回文时间 - 携程机试真题题解
数据结构·python·算法·华为od·机试
蓝白咖啡16 天前
华为OD机试 - 王者荣耀匹配机制 - 回溯(Java 2024 D卷 200分)
java·python·算法·华为od·机试
郝晨妤22 天前
鸿蒙常见面试题(欢迎投稿一起完善持续更新——已更新到62)
服务器·javascript·华为od·华为·harmonyos·鸿蒙
程序员yt25 天前
西交建筑学本科秋天毕业想转码,自学了Python+408,华为OD社招还是考研更香?
python·考研·华为od
CodeClimb1 个月前
【华为OD-E卷 - 单词接龙 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od