zoukankan      html  css  js  c++  java
  • hdu 3415

    http://acm.hdu.edu.cn/showproblem.php?pid=3415

    【题意】给出 一个k  和n个数 求 长度不超过k的 最大 连续子序列和 再输出起始和终止位置

    【思路】 求连续的a[j]~a[i]的和最大 即求sum[i]-sum[j]最大 即对于每一个i 找一个最小的sum[j] 且i-j>k

               n最多有100000 个O( n^2)的复杂度绝对超时   所以要用优先队列优化

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    int a[200012],sum[200012],d[200002];//数组长度至少为n*2
    int num[200002];
    
    int main()
    {
        int i,j,n,m,t,flag,p;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            sum[0]=0;
            int maxxx=-100000;
            for(i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                sum[i]=sum[i-1]+a[i];
            }
            for(;i<=n+m;i++)
                sum[i]=sum[i-1]+a[i-n];
            int front1,rear,start,end1;
            front1=rear=0;
    
            int ans=(-1)*10000000;
            for(i=1;i<=n+m;i++)
            {
                while(rear>front1&&(i-num[front1]>m))
                    front1++;
    
                while(rear>front1&&sum[num[rear-1]]>sum[i-1])//  注意不是sum[i]
                    rear--;
    
                num[rear++]=i-1;//注意不是i
    
    
                d[i]=sum[i]-sum[num[front1]];
    
                if(ans<d[i])
                {
                    start=num[front1]+1;
                    end1=i;
                    ans=d[i];
    
                }
    
            }if(end1>n)
                        end1-=n;
                if(start>n)
                        start-=n;
            printf("%d %d %d
    ",ans,start,end1);
        }
        return 0;
    }
  • 相关阅读:
    vscode maven
    clojure + sumblime text SublimeREPL
    .zsh_history
    springboot-自动装配
    任务调度-Quartz
    springcloud alibaba
    canal与kafka的结合使用
    centos7安装Zookeeper
    centos7安装kafka
    vmware+centos7 设置静态ip
  • 原文地址:https://www.cnblogs.com/assult/p/3477153.html
Copyright © 2011-2022 走看看