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();方法获得对应的值。

 

posted @ 2022-03-25 18:54  Jukim  阅读(1915)  评论(0编辑  收藏  举报