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];
}
}
}