在通信系統中有一個常見的問題是對用戶進行不同策略的調度,會得到不同系統消耗的性能
假設由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();方法獲得對應的值。