在通信系统中有一个常见的问题是对用户进行不同策略的调度 会得到不同系统消耗的性能 假设由N个待串行用户,每个用户可以使用A/B/C三种不同的调度策略,不同的策略会消耗不同的系统资源。请你根据如下规则进行用户调度并返回总的消耗资源数。
规则是:相邻的用户不能使用相同的调度策略
例如: 第一个用户使用A策略 则第二个用户只能使用B和C策略 对单的用户而言,不同的调度策略对系统资源的消耗可以规划后抽象为数值。
例如 某用户分别使用ABC策略的系统消耗,分别为15 8 17 每个用户依次选择当前所能选择的对系统资源消耗最少的策略,局部最优 如果有多个满足要求的策略,选最后一个
输入描述: 第一行表示用户个数N 接下来表示每一行表示一个用户分别使用三个策略的资源消耗 resA resB resC 输出描述: 最优策略组合下的总的系统消耗资源数
示例一: 输入:
3
15 8 7
12 20 9
11 7 5
输出: 24 说明: 1号用户使用B策略 2号用户使用C策略 3号用户使用B策略 系统资源消耗8+9+7
目的是局部最优,可以考虑轮流寻找每个用户的最小值然后计算其他用户的值取最小。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = Integer.parseInt(sc.nextLine());
String []str = new String[num];
for (int i = 0; i < num; i++) {
str[i] = sc.nextLine();
}
//轮流数组
int step = 0;
int sum = 0;
int minSum = Integer.MAX_VALUE;
//记录大轮数
int out = num;
//记录小轮数
int count = 0;
//flag数组记录每个数组取值的下标
int []flag = new int[num];
Arrays.fill(flag,-1);
while (out!=0){
if (step==0)
flag[step]=min(str[step],flag[step+1]);
else
flag[step]=min(str[step],flag[step-1]);
sum += Integer.parseInt(str[step].split(" ")[flag[step]]);
step++;
count++;
if (step==num)
step = 0;
if (count==num){
if (sum<minSum)
minSum =sum;
count = 0;
out--;
step = num-out;
Arrays.fill(flag,-1);
sum = 0;
}
}
System.out.println(minSum);
}
public static int min(String str,int k){
String []nums = str.split(" ");
int min = Integer.MAX_VALUE;
int pos = 0;
for (int i = 0; i < nums.length; i++) {
if (Integer.parseInt(nums[i])<min&&i!=k){
min = Integer.parseInt(nums[i]);
pos = i;
}
}
return pos;
}
如有错误或改进,请各位大佬支招。