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

}
相关推荐
敲击Time3 天前
【华为OD机考真题】- 星际篮球争霸赛(Java)
java·华为od
敲击Time7 天前
【华为OD机考真题】- 路灯照明(Java)
java·链表·华为od
大多_C7 天前
python机试1:读取和输出数据
开发语言·python·华为od
敲击Time9 天前
AI面板识别 - 华为OD统一考试(java)
开发语言·python·华为od
敲击Time9 天前
【华为OD题库-040】计算最接近的数-java
java·python·华为od
油泼辣子多加9 天前
【华为OD机考】华为OD笔试真题解析(20)--投篮大赛
数据结构·算法·华为od
m0_7482548810 天前
【华为OD机考】2024E+D卷真题【完全原创题解 详细考点分类 不断更新题目 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·华为od
耀耀zz11 天前
2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中...
算法·华为od
菲儿啊13 天前
华为OD-2024年E卷-分批萨[100分]
华为od