列表

详情


NC16137. 相邻的糖果

描述

有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,所以不需要进行任何操作。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 326ms, 内存消耗: 17788K, 提交时间: 2020-08-31 09:10:26

#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;
}

C++11(clang++ 3.9) 解法, 执行用时: 476ms, 内存消耗: 17792K, 提交时间: 2020-03-29 15:48:13

#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;
}

上一题