AcWing 1087. 修剪草坪
在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。
现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。
然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。
FJ 有 N只排成一排的奶牛,编号为 1到 N。
每只奶牛的效率是不同的,奶牛 i的效率为 Ei。
编号相邻的奶牛们很熟悉,如果 FJ 安排超过 K只编号连续的奶牛,那么这些奶牛就会罢工去开派对。
因此,现在 FJ 需要你的帮助,找到最合理的安排方案并计算 FJ 可以得到的最大效率。
注意,方案需满足不能包含超过 K只编号连续的奶牛。
输入格式
第一行:空格隔开的两个整数 N和 K;
第二到 N+1行:第 i+1行有一个整数 Ei。
输出格式
共一行,包含一个数值,表示 FJ 可以得到的最大的效率值。
数据范围
1≤N≤10^5,0≤Ei≤10^9
5 2
1
2
3
4
5
12
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n,m;
int q[N];
LL s[N],f[N];
LL g(int i)
{
return f[max(0,i-1)]-s[i];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]+=s[i-1];
}
int hh=0,tt=0;
for(int i=1;i<=n;i++)
{
if(q[hh]<i-m) hh++;
f[i]=max(f[i-1],g(q[hh])+s[i]); //在 [i - m, i - 1] 中找一个最大的 g
while(hh<=tt&&g(q[tt])<=g(i)) tt--; //严格单调递减,队头即最大值
q[++tt]=i;
}
cout<<f[n]<<endl;
return 0;
}