zoukankan      html  css  js  c++  java
  • BZOJ2442: [Usaco2011 Open]修剪草坪

    2442: [Usaco2011 Open]修剪草坪

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 500  Solved: 244
    [Submit][Status]

    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只奶牛。

    Input


    * 第一行:空格隔开的两个整数N和K

    * 第二到N+1行:第i+1行有一个整数E_i


    Output


    * 第一行:一个值,表示FJ可以得到的最大的效率值。

    Sample Input

    5 2
    1
    2
    3
    4
    5

    输入解释:

    FJ有5只奶牛,他们的效率为1,2,3,4,5。他们希望选取效率总和最大的奶牛,但是
    他不能选取超过2只连续的奶牛

    Sample Output


    12

    FJ可以选择出了第三只以外的其他奶牛,总的效率为1+2+4+5=12。

    HINT

    Source

    Gold

    题解:

    刚开始看见有种线段树的赶脚,后来发现情况有点儿复杂。。。

    status里代码为何这么短?所以肯定不是线段树

    考虑DP

    f[i] 表示选 a[i] 能获得的最大和

    g[i] 表示不选 a[i] 能获得的最大和

    则  f[i]=max(g[j]+s[i]-s[j])=max(g[j]-s[j])+s[i]  i-j<=k

         g[i]=max(g[i-1],f[i-1])

    然后我们发现能更新到 i 的j 范围单调不减,而我们要求一段区间内的最大值

    这让我们想到了单调队列,然后就可以随便虐了

    代码;

     1 #include<cstdio>
     2 
     3 #include<cstdlib>
     4 
     5 #include<cmath>
     6 
     7 #include<cstring>
     8 
     9 #include<algorithm>
    10 
    11 #include<iostream>
    12 
    13 #include<vector>
    14 
    15 #include<map>
    16 
    17 #include<set>
    18 
    19 #include<queue>
    20 
    21 #include<string>
    22 
    23 #define inf 1000000000
    24 
    25 #define maxn 100000+10
    26 
    27 #define maxm 500+100
    28 
    29 #define eps 1e-10
    30 
    31 #define ll long long
    32 
    33 #define pa pair<int,int>
    34 
    35 #define for0(i,n) for(int i=0;i<=(n);i++)
    36 
    37 #define for1(i,n) for(int i=1;i<=(n);i++)
    38 
    39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    40 
    41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    42 
    43 #define mod 1000000007
    44 
    45 using namespace std;
    46 
    47 inline int read()
    48 
    49 {
    50 
    51     int x=0,f=1;char ch=getchar();
    52 
    53     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    54 
    55     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    56 
    57     return x*f;
    58 
    59 }
    60 ll f[maxn],g[maxn],s[maxn];
    61 int n,k,q[maxn];
    62 
    63 int main()
    64 
    65 {
    66 
    67     freopen("input.txt","r",stdin);
    68 
    69     freopen("output.txt","w",stdout);
    70 
    71     n=read();k=read();
    72     for1(i,n)s[i]=s[i-1]+read();
    73     int l=1,r=1;
    74     for1(i,n)
    75     {
    76         while(l<r&&i-q[l]>k)l++;
    77         f[i]=g[q[l]]-s[q[l]]+s[i];
    78         g[i]=max(f[i-1],g[i-1]);
    79         while(l<=r&&g[q[r]]-s[q[r]]<=g[i]-s[i])r--;
    80         q[++r]=i;
    81     }
    82     printf("%lld
    ",max(f[n],g[n]));
    83 
    84     return 0;
    85 
    86 }
    View Code
  • 相关阅读:
    fiddler的使用
    redis pipeline
    redis hash map
    redis队列的实现
    PHP-redis中文文档-命令
    websocket
    c++之socket,阻塞模式
    Django上传文件和修改date格式
    通过字符串导入模块
    'CSRFCheck' object has no attribute 'process_request' 报错
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4031711.html
Copyright © 2011-2022 走看看