14.通信系统调度策略问题
在通信系统中有一个常见的问题是对用户进行不同策略的调度,会得到不同系统消耗的性能
假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源
请你根据如下规则进行用户调度,并返回总的消耗资源数。
规则是:相邻的用户不能使用相同的调度策略
例如:第一个用户使用A策略 则第二个用户只能使用B和C策略。
对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值。例如:某用户分别使用ABC策略的系统消耗,分别为15 8 17,每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优,如果有多个满足要求的策略,选最后一个。
输入描述:
第一行表示用户个数N
接下来表示每一行表示一个用户分别使用三个策略的资源消耗,resA resB resC
输出描述:
最优策略组合下的总的系统消耗资源数
示例一:
输入:
3
15 8 17
12 20 9
11 7 5
输出:
24
说明:
1号用户使用B策略
2号用户使用C策略
3号用户使用B策略
系统资源消耗8+9+7
查看代码
import java.util.*;
public class Demo14 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = Integer.parseInt(sc.nextLine());
ArrayList<TreeMap<Integer, Integer>> mapList = new ArrayList<>();
for(int i = 0; i < N; i++){
String[] split = sc.nextLine().split(" ");
TreeMap<Integer, Integer> map = new TreeMap<>();
for(int j = 0; j < split.length; j++){
map.put(Integer.parseInt(split[j]), j);
}
mapList.add(map);
}
int[] sum = new int[3];
//保证第一个用户每一种策略都使用,并不按最小值来
ArrayList<Integer> keyList = new ArrayList<>(mapList.get(0).keySet());
for(int i = 0; i < 3; i++){
Integer res1 = keyList.get(i);
sum[i] = res1;
Integer type1 = mapList.get(0).get(res1);
//其它用户根据在类型不同的情况下,选择调度消耗最小的。
for(int j = 1; j < N; j++){
ArrayList<Integer> keyNList = new ArrayList<>(mapList.get(j).keySet());
Integer resN = keyNList.get(0);
Integer typeN = mapList.get(j).get(resN);
if(typeN != type1){ //当调度类型不同时直接相加
sum[i] += resN;
type1 = typeN;
}else{
resN = keyNList.get(1); //相同时,那么下标为1的必定类型不同
sum[i] += resN;
type1 = mapList.get(j).get(resN);
}
}
}
//因为第一个用户每一种策略都操作了,故选择其中最小值就是所求。
int min = Integer.MAX_VALUE;
for(int i : sum){
if(i < min) min = i;
}
System.out.println(min);
}
}
总结:有参构造不熟悉!
keySet!!!
对于Map集合中本身已经有一个方法可以直接取出Map集合中的值,这个方法分别是get();方法。这个方法只能是利用键来取出值,但是如何来取出键呢?
然后在API中找到了另外一个方法,keySet();方法,这个方法可以取出Map中所有的键所在的Set集合;再通过Set的迭代器获取到每一个键,之后再用get();方法获得对应的值。