此题重点在于区间加/减 ,且最终序列的特征是差值均为0,对一个区间加不影响中间的差值
于是构差分数组,有:
为了使得最终差分数组均为0(除了d[1]) ,我们应该贪心地选择[l,r] ,这样一来,算出负数的和的绝对值,正数的和的绝对值,取最小值再加上绝对值的差的绝对值,就是需要操作的最少次数。(贪心)
而最终可能的大小,也就是d[1]的可能大小,某个正数或者负数可以通过与d[1]或者d[n+1]配对,总共配对abs(z-f)次,与d[1]可能配对 0,1,2,3…abs(z-f) 次,所以d[1]的值有abs(z-f)+1次
AC CODE:
import java.math.BigInteger; import java.math.*; import java.io.*; import java.util.Scanner; public class Main{ static int maxn = 100000 + 5; static long a[] = new long [maxn]; public static void main(String[] args){ int T; int n; Scanner in = new Scanner (System.in); n = in.nextInt(); long r,l; r = l = 0; for(int i = 0; i < n; i++){ a[i]=in.nextLong(); if(i > 0) { if (a[i] - a[i - 1] > 0) l += a[i] - a[i - 1]; else r += a[i - 1] - a[i]; } } System.out.println(Math.min(l,r)+Math.abs(l-r)); System.out.println(1+Math.abs(l-r)); in.close(); } }