题目:
题解:
跟昨天的修建草坪是一样的。
这里对于队中已有元素0再做赘述:放一位0,在满m位之前一直会 < q[head],当m位已满,这一位0就会因为过时被t
代码:
#include <cstdio>
#include <iostream>
#define INF 1e9
#define N 1000005
using namespace std;
int a[N],f[N],q[N];
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
int tail=1,head=1;
for (i=1;i<=n;i++)
{
while (head<=tail && q[head]<i-m) head++;
f[i]=a[i]+f[q[head]];
while (head<=tail && f[q[tail]]>=f[i]) tail--;
q[++tail]=i;
}
int ans=INF;
for (i=n-m+1;i<=n;i++) ans=min(ans,f[i]);
printf("%d",ans);
}