AtCoder 2152

题意:学姐很喜欢吃糖果(毕竟是女生嘛),所以学姐收藏了很多种糖果,分别放在了n个盒子里面并且从左到右每个盒子里面的的糖果个数为a1,a2,,,an;学姐很喜欢玩儿,所以在吃糖果的时候也不闲着,她每次选择一个包含至少一个糖果的盒子,然后在所选盒子里吃掉一个糖果,她的目标是吃糖果吃到使任意两个相邻盒子里的糖果数和最大为x,但是吃太多糖果会发胖,所以学姐现在请你们求出学姐要吃的最少的糖果个数。

这个题容易让人想麻烦而无从下手,贪心?dp?不存在的,直接顺着找,找到相邻的和大于x就吃右边的糖。值得注意的是,有可能一个盒子的糖果数就大于x了,所以需要一个中间变量now指示正在查的盒子,初始化为0,如果now+a[i]<=x,则把a[i]赋给now,否则先让a[i]减去大于x的个数然后把新的a[i]赋给now。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define fo freopen("in.txt","r",stdin)
#define fc fclose(stdin)
#define fu0(i,n) for(i=0;i<n;i++)
#define fu1(i,n) for(i=1;i<=n;i++)
#define fd0(i,n) for(i=n-1;i>=0;i--)
#define fd1(i,n) for(i=n;i>0;i--)
#define mst(a,b) memset(a,b,sizeof(a))
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d %d",&n,&m)
#define ss(s) scanf("%s",s)
#define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k)
#define pans() printf("%d\n",ans)
#define all(a) a.begin(),a.end()
#define sc(c) scanf("%c",&c)
#define we(a) while(scanf("%d",&a)!=EOF)
const int maxn=200005;
const double eps=1e-8;

int main()
{
    ll n,x;
    while(cin>>n>>x)
    {
        ll a[100005],num=0,now=0;
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
        }
        for(int i=0; i<n; i++)
        {
            if(now+a[i]<=x)//可能一个盒子的糖果数就超过了x。。
            {
                now=a[i];
            }
            else
            {
                num+=(now+a[i]-x);
                now=a[i]-(a[i]+now-x);

            }
        }
        cout<<num<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dilly__dally/article/details/80420985
今日推荐