题目来源,牛客小白月赛4 H题
链接:https://www.nowcoder.com/acm/contest/134/H
来源:牛客网
题目描述
有n个盒子摆成一排,每个盒子内都有ai个糖果。
现在你可以执行以下操作:
·你可以选择任意一个盒子,在选择的盒子内吃掉一个糖果。
对你的要求如下:
·任何m个相邻的盒子内糖果数量不能超过x个。
请问,实现要求的最少操作次数是多少?
输入描述:
第一行三个数字n, m, x(2 ≤ n,m ≤ 106,1 ≤ x ≤ 109)。
第二行n个数字(1 ≤ ai ≤ 109)。
输出描述:
输出一个操作数,代表实现要求的最少操作数。
示例1
输入
3 2 3
2 1 2
输出
0
说明
2 1 2满足题目要求,任意相邻的两个数值之和均不超过3,所以不需要进行任何操作。
解题思路
遍历求和,维护当前区间的和,当i>m
时,删除前面的点。当和大于x
时,改变a[i]。
AC代码
#include<iostream>
using namespace std;
int main()
{
long long int n,m,x,tot=0,ans=0;
cin>>n>>m>>x;
long long int a[n+1];
for (int i=1;i<=n;i++)
{
cin>>a[i];
tot+=a[i];
if (i>m)
tot-=a[i-m];
if (tot>x)
{
a[i]-=tot-x;
ans+=tot-x;
tot=x;
}
}
cout<<ans;
}