洛谷P3817 小A的糖果 (贪心算法,java实现)

在这里插入图片描述

在这里插入图片描述

   根据题目我们可以知道,除了第一个元素以外,其余的元素大小均和它的前一个元素有关,如果我们把他的前一个元素已经弄到标准范围内了,如果它俩的和还是大于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]这个关系式

猜你喜欢

转载自blog.csdn.net/weixin_51656756/article/details/121514194