[牛客小白月赛4 H] 相邻的糖果

Description

有n个盒子摆成一排,每个盒子内都有ai个糖果。
现在你可以执行以下操作:
·你可以选择任意一个盒子,在选择的盒子内吃掉一个糖果。
对你的要求如下:
·任何m个相邻的盒子内糖果数量不能超过x个。
请问,实现要求的最少操作次数是多少?

Input

第一行三个数字n, m, x \((2 ≤ n,m ≤ 10^6,1 ≤ x ≤ 10^9)\)。第二行n个数字\((1 ≤ ai ≤ 10^9)\)

Output

输出一个操作数,代表实现要求的最少操作数。

Solution

感觉有点像滑动窗口。

从左往右扫过,维护当前区间的和。

如果大于 \(x\),那么令 \(val[i]-=(tot-x),tot=x\)

注意左边界即

if(i>m)
    tot-=val[i]

这样可以解决 \(val[i]\) “不够” 的情况。

Code

#include<cstdio>
#define N 1000005
#define int long long

int n,m,x;
int val[N],ans;

signed main(){
    scanf("%lld%lld%lld",&n,&m,&x);
    int tot=0;
    for(int i=1;i<=n;i++){
        scanf("%lld",&val[i]);
        tot+=val[i];
        if(i>m) tot-=val[i-m];
        if(tot>x)
            val[i]-=tot-x,ans+=tot-x,tot=x;
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/YoungNeal/p/9191769.html