定义一个数组的的陡峭值为:相邻两个元素之差的绝对值之和。
现在小美拿到了一个数组,她可以最多进行1次操作:选择一个区间,使得区间内所有元素加1。
小美希望最终数组的陡峭值尽可能小,你能帮帮她吗?
第一行输入一个正整数,代表询问次数。
对于每次询问输入两行:
第一行输入一个正整数,代表数组长度。
第二行输入个正整数
,代表小美拿到的数组。
保证所有询问的的总和不超过
输出行,输出一个整数,代表该次查询陡峭值的最小值。
2 5 1 4 2 3 4 3 1 2 1
5 1
第一组询问,选择[3,4]区间即可,数组变成{1,4,3,4,4}。
第二组询问,选择[1,1]区间即可,数组变成{2,2,1}。
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int t = in.nextInt();
while(t--!=0){
int n = in.nextInt();
long[] a = new long[n+1];
//输入的时候顺便计算原本的陡峭值,(tips:操作后陡峭值的变化一共只有三种情况:1.减二 2.减一 3.不变)
long sum = 0;
for(int i=1;i<=n;i++){
a[i] = in.nextLong();
if(i == 1)continue;
sum+=Math.abs(a[i] - a[i-1]);
}
//设置标志位,看看有符合这样条件的区间:[l,r] (l-1位置比l位置大)&&(r位置比r+1位置小)
int l = -1,r = -1;
for(int i =1;i<n;i++){
//只找最左侧的
if(l == -1 && a[i] > a[i+1])l = i+1;
//只找最右侧的
if(a[i] < a[i+1])r = i;
}
//分情况讨论
if(l == -1 && r== -1)System.out.println(sum);
else if(l!= -1 && r!= -1 && l <= r)System.out.println(sum-2);
else System.out.println(sum-1);
}
}
}