【题目背景】在游戏《星际争霸II》中,高阶圣堂武士作为星灵的重要AOE单位,在游戏的中后期发挥着重要的作用,其技能”灵能风暴“可以消耗大量的灵能对一片区域内的敌军造成毁灭性的伤害。经常用于对抗人类的生化部队和虫族的刺蛇飞龙等低血量单位。【问题描述】你控制着n名高阶圣堂武士,方便起见标为1,2,… ,n。每名高阶圣堂武士需要一定的灵能来战斗,每个人有一个灵能值a表示其拥有的灵能的多少(a;非负表示这名高阶圣堂武士比在最佳状态下多余了a点灵能,a;为负则表示这名高阶圣堂武士还需要-a;点灵能才能到达最佳战斗状态)。现在系统赋予了你的高阶圣堂武士一个能力,传递灵能,每次你可以选择一个i ∈ [2,n一1],若ai ≥0则其两旁的高阶圣堂武士,也就是i-1、i+1这两名高阶圣堂武士会从i这名高阶圣堂武士这里各抽取a点灵能:若ai<0则其两旁的高阶圣堂武士,也就是i-1,i+1这两名高阶圣堂武士会给i这名高阶圣堂武士-a点灵能。形式化来讲就是ai-1+ = ai,a+1+ = a,a-=2a。灵能是非常高效的作战工具,同时也非常危险且不稳定,一位高阶圣堂武士拥有的灵能过多或者过少都不好,定义一组高阶圣堂武士的不稳定度为
,请你通过不限次数的传递灵能操作使得你控制的这一组高阶圣堂武士的不稳定度最小。
这道题的重点是传输 也就是说除了两边的战士,其他的战士都可以传递灵能,
传递的规律是:
ai-1+ = ai,a+1+ = a,a-=2a。
根据其规律可以演算出:
当有3位战士时:
当有4位战士时:
…
以此类推不论有几个战士,他们通过循环灵能传输,最终都会回到原来的灵能,根据这一点便可找出他们的最小不稳定度。
代码:
import java.util.Scanner;
public class Text01 {
public static void main(String[] args) {
int[][] arr = new int[new Scanner(System.in).nextInt()][];
for(int i=0; i<arr.length; i++) {
arr[i] = new int[new Scanner(System.in).nextInt()];
arr[i] = fuzhi(arr[i]);
}
for(int i=0; i<arr.length; i++) {
System.out.println(compute(arr[i]));
}
}
public static int[] fuzhi(int[] arr){
String[] arr_s = new Scanner(System.in).nextLine().split(" ");
for(int i=0; i<arr.length; i++) {
arr[i] = Integer.parseInt(arr_s[i]);
}
return arr;
}
public static int compute(int[] arr) {
int Min = 0;
int[] arr1 = new int[arr.length];
for(int i=0; i<arr.length; i++) {
arr1[i] = arr[i];
}
for(int i=0; i<arr.length; i++) {
if(Min < Math.abs(arr[i])) {
Min = Math.abs(arr[i]);
}
}
do {
for(int i=1; i<arr.length-1; i++) {
arr[i-1] += arr[i];
arr[i+1] += arr[i];
arr[i] = -arr[i];
}
int Max = 0;
for(int i=0; i<arr.length; i++) {
if(Max < Math.abs(arr[i])) {
Max = Math.abs(arr[i]);
}
}
if(Min > Max) {
Min = Max;
}
} while (!isEqual(arr1, arr));
return Min;
}
public static boolean isEqual(int[] arr1, int[] arr2) {
for(int i=0; i<arr1.length; i++) {
if(arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
}