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();方法獲得對應的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM