zoukankan      html  css  js  c++  java
  • 【COGS1384】鱼儿仪仗队

    【题目描述】

    Jzyz的池塘里有很多条鱼,鱼儿们现在决定组成一个仪仗队。现在备选的N(1 <= N <= 100,000)条鱼排成了一条直线,并且按照亲近关系排的队伍,鱼儿的顺序不能改变,现在知道每条鱼的魅力值是Xi(0 <=Xi <= 1,000,000,000)。

    挑选仪仗队的任务交给了小x手里(小x并不是鱼),小x发现,如果连续的挑选超过K条鱼,那么这些鱼因为关系太好,结成小团队,影响仪仗队的团结。

    所以,小x挑选仪仗队的唯一原则是不能连续挑选超过K条鱼,现在小x想知道,组成仪仗队的鱼儿的最大的魅力值之和是多少。

    【输入格式】

    第一行:两个整数N和K

    接下来N行,每行一个整数Xi,表示第i条鱼的魅力值。

    【输出格式】

    一个整数,表示仪仗队最大的魅力值之和。

    【分析】

    一道简单的单调队列,不解释了。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cmath>
     5 #include <cstdio>
     6 const int maxn=100010;
     7 using namespace std;
     8 long long Q[maxn],shu[maxn];
     9 long long f[maxn],n,k;
    10 int main()
    11 {
    12     long long i,lj=0;
    13         memset(f,0,sizeof(f));
    14     
    15     scanf("%lld%lld",&n,&k);
    16     for (i=1;i<=n;i++) {scanf("%lld",&shu[i]);lj+=shu[i];}
    17     int front=1,rear=1;
    18     for (i=1;i<=(n+1);i++)
    19     {
    20         while (front<rear && (i-Q[front]-1)>k) front++;
    21         if (i-1<=k) f[i]=min(shu[i],f[Q[front]]+shu[i]);
    22         else f[i]=f[Q[front]]+shu[i];
    23         while (front<rear && f[i]<f[Q[rear]]) rear--;
    24         Q[++rear]=i;
    25     }
    26     printf("%lld",lj-f[n+1]);
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    Java遍历Map、List、Array
    自签名SSL生成
    oracle_round
    Timestamp_时间戳
    oracle_substr
    eval
    orcale_聚合函数
    oracle_decode
    js_JSON
    sql拼接
  • 原文地址:https://www.cnblogs.com/hoskey/p/3742107.html
Copyright © 2011-2022 走看看