1 条题解

  • 0
    @ 2025-8-24 21:53:02

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lzk5627
    古来圣贤皆寂寞,惟有饮者留其名

    搬运于2025-08-24 21:53:02,当前版本为作者最后更新于2018-04-21 16:27:23,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    好吧这是道水题(只要你找到方法) 首先我们可以把这几个糖果盒分对来讨论; 先从第一个糖果盒和第二个开始; 如果一个糖果盒的数量就超限了,我们当然至少要把它吃到剩下x个; 然后如果单论两个都没有超限,但加起来超限了怎么办呢? 首先第一个糖果盒是只有一个分组的(和第二个), 而第二个糖果盒却有两个分组(和第1个/和第3个); 所以如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少2个分组的量。所以我们要尽量吃掉第二个里的糖果。 处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推就好了。

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	long long sum=0//计数器,n,x;
    	cin>>n>>x;//输入
    	long long a[n+1];
    	cin>>a[1];//处理第一个单独超限。
    	if(a[1]>x)
    		{
    		sum+=a[1]-x;//增加吃的量
    		a[1]=x;//a[i]>=x,要吃的最少,即是a[i]=x;
    		}
    	for(int i=2;i<=n;i++)
    		{
    		cin>>a[i];//输入
    		if(a[i]+a[i-1]>x)//照例处理
    			{
    			sum+=a[i]+a[i-1]-x;
    			a[i]=x-a[i-1];
    			}
    		}
    	cout<<sum;//输出
    	return 0;//养成好习惯
    } 
    
    • 1

    信息

    ID
    2733
    时间
    1000ms
    内存
    500MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者