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

}
相关推荐
塔中妖5 天前
【华为OD】分割数组的最大差值
数据结构·算法·华为od
塔中妖6 天前
【华为OD】数字游戏
算法·游戏·华为od
熊文豪7 天前
【华为OD】找出通过车辆最多颜色
算法·华为od
塔中妖7 天前
【华为OD】环中最长子串2
算法·华为od
熊文豪7 天前
【华为OD】区块链文件转储系统
算法·华为od·区块链
塔中妖7 天前
【华为OD】Linux发行版的数量
linux·算法·华为od
熊文豪7 天前
【华为OD】阿里巴巴找黄金宝箱
算法·华为od
塔中妖7 天前
【华为OD】5G网络建设
网络·5g·华为od
塔中妖8 天前
【华为OD】查找接口成功率最优时间段
算法·链表·华为od
塔中妖8 天前
【华为OD】最大子矩阵和
算法·华为od·矩阵