zoukankan      html  css  js  c++  java
  • tyvj1305 最大子序和

    P1305 最大子序和
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。

    例如 1,-3,5,1,-2,3

    当m=4时,S=5+1-2+3=7
    当m=2或m=3时,S=5+1=6

    输入格式

    第一行两个数n,m
    第二行有n个数,要求在n个数找到最大子序和

    输出格式

    一个数,数出他们的最大子序和

    测试样例1

    输入

    6 4 
    1 -3 5 1 -2 3

    输出

    7

    备注

    数据范围:
    100%满足n,m<=300000
     
    sum[i]表示前缀和
    ans=max(sum[i]-sum[j]) i-m<=j<i
    单调队列维护sum[j]递增
    #include<cstdio>
    #include<algorithm>
    #define N 300010
    using namespace std;
    int que[N],head,tail,n,m;
    long long sum[N],ans;
    int main()
    {
        scanf("%d%d",&n,&m);
        int x;
        for(int i=1;i<=n;i++) 
        {
            scanf("%d",&x);
            sum[i]=sum[i-1]+x;
        }
        for(int i=1;i<=n;i++)
        {
            while(head<tail&&que[head]<i-m) head++;
            while(head<tail&&sum[i]<=sum[que[tail-1]]) tail--;
            ans=max(ans,sum[i]-sum[que[head]]);
            que[tail++]=i;
        }
        printf("%lld",ans);
    }
       ans=max(ans,sum[i]-sum[que[head]]);
       que[tail++]=i;
    对于 先更新答案再入队 还是 先入队再更新答案 有两种写法
    例:5 1
    10 2 2 2 2
    head=0; tail=0; 即开始是空队列
    就要先更新答案再入队

    head=0, tail=1;即开始有一个0元素在队列里
    顺序无所谓

  • 相关阅读:
    dracut-initqueue timeout
    Request.Url
    ipv4 ipv6数据库存储
    DataRow To DataTable
    AS ShortCut
    linq on 多链接条件
    SQL逻辑查询语句执行顺序
    ckeditor 使用几点
    SqlDataAdapter 更新插入 与 InsertBulkCopy
    HTTP协议改HTTPS
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6836545.html
Copyright © 2011-2022 走看看