根据题目我们可以知道,除了第一个元素以外,其余的元素大小均和它的前一个元素有关,如果我们把他的前一个元素已经弄到标准范围内了,如果它俩的和还是大于x,这时候只需要修改后一个的值就可以、就不需要想着如果他俩都小于x,但是和大于x,这个时候该怎么取啥啥啥的。
第一个元素是特判,如果第一个元素大于x,糖果总数sum+=a[1]-x,然后a[1]就要变为x,就相当于a[1]把比x多的都吃了,所以就剩下了x;接下来就是后面的,如果a[2]+a[1]>x。这时候肯定要拿的是a[2]了,a[1]已经不能再吃了,所以只能是从a[2]中吃,所以sum+=a[2]+a[1]-x,这个时候我们就得想想a[2]应该变为多少,我们发现存在这么一个关系,最终我们要得到的是a[2]+a[1]=x,所以a[2]=x-a[1];这个就是我们最后需要的式子。接下来看下代码吧:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
long sum=0;
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int x=scanner.nextInt();
int[] arr=new int[n];
arr[0]=scanner.nextInt();
if(arr[0]>x) {
sum+=arr[0]-x;
arr[0]=x;
}
for(int i=1;i<n;i++) {
arr[i]=scanner.nextInt();
if(arr[i]+arr[i-1]>x) {
sum+=arr[i]+arr[i-1]-x;
arr[i]=x-arr[i-1];
}
}
System.out.println(sum);
}
}
接下来我们顺着代码模拟一下样例2
首先a[0]<x,所以不进if,然后就进入到了for循环,i=1:a[1]+a[0]=7>x,sum+=7-x=7-1=6,arr[1]=x-a[0]=1-1=0;
i=2:a[2]+a[1]=1+0=1<x,不进if
i=3:a[3]+a[2]=2+1=3>x,sum+=3-x=2,arr[3]=x-arr[2]=1-1=0
i=4:a[4]+a[3]=0+0=0<x,不进if
i=5:a[5]+a[4]=4+0=4>x,sum+=4-x=3,arr[5]=x-arr[4]=1-0=1;
最后的到的结果为11
整道题最重要的就是要推导出来arr[i]=x-arr[i-1]这个关系式