BZOJ 2442 [Usaco2011 Open]修剪草坪

来源:互联网 发布:淘宝店家旺旺号是什么 编辑:程序博客网 时间:2024/04/28 05:34

Description
在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,
新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。
然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N
(1 <= N <= 100,000)只排成一排的奶牛,编号为1…N。每只奶牛的效率是不同的,
奶牛i的效率为E_i(0 <= E_i <= 1,000,000,000)。
靠近的奶牛们很熟悉,因此,如果FJ安排超过K只连续的奶牛,那么,这些奶牛就会罢工
去开派对:)。因此,现在FJ需要你的帮助,计算FJ可以得到的最大效率,并且该方案中
没有连续的超过K只奶牛。


【题目分析】
单调队列优化DP


【代码】

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,k;long long ans=0;long long dp[100001];long long e[100001];int que[100001];int hd=1,tl=0;int main(){    scanf("%d%d",&n,&k);    for (int i=1;i<=n;++i)    {        scanf("%lld",&e[i]);        e[i]+=e[i-1];    }    que[++tl]=0;    for (int i=1;i<=n+1;++i)    {        while (hd<tl&&i-que[hd]>k+1) hd++;        dp[i]=max(dp[i],dp[que[hd]]+e[i-1]-e[que[hd]]);        ans=max(ans,dp[i]);        while (hd<=tl&&dp[que[tl]]-e[que[tl]]<=dp[i]-e[i]) tl--; que[++tl]=i;    }    printf("%lld\n",ans);}
0 0