• 1490: 连续子串和


    1490: 连续子串和

    http://www.acmore.net/problem.php?id=1490

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 209  Solved: 36

    Description

    小Y前段时间刚刚做完连续子串和问题,相信大家对连续子串和也都不陌生,现在小Y又碰到了一个新的难题,给定N个整数,求至少K个数连续的最大和为多少?

    Input

    若干组测试数据,每组数据第一行给出两个数N(1<=N<=10^6),K(1<=K<=N)。接下来一行N个数字,分别是a1,a2...aN,对于每个数满足-1000<=ai<=1000。

    Output

    输出长度大于等于K的连续整数和值中最大的一个。

    Sample Input

    5 3 -2 3 6 0 1

    Sample Output

    10

    HINT

     

    Source

    Lyush

    贪心题,枚举每一个数字作为结束点。保留前i位的前缀和sum[i],对于第i为结束的合法序列,其值为sum[i]-sum[i-K],sum[i]-sum[i-K-1],...,sum[i]-sum[0],那么我们只需要对每一个 i 保留sum[0]到sum[i-K]的最小值即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    const int maxn=1000010;
    const int INF=0x3f3f3f3f;
    
    int n,k;
    int num[maxn];
    
    int Solve(){
        int ans=-INF;
        int tmp=INF;
        for(int i=k;i<=n;i++){
            tmp=min(tmp,num[i-k]);
            ans=max(ans,num[i]-tmp);
        }
        return ans;
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        while(~scanf("%d%d",&n,&k)){
            for(int i=1;i<=n;i++){
                scanf("%d",&num[i]);
                num[i]+=num[i-1];
            }
            printf("%d\n",Solve());
        }
        return 0;
    }
  • 相关阅读:
    (转)基于C#的socket编程的TCP异步实现
    socket
    (转)抽象类、抽象属性、抽象方法
    (转)c# 互斥锁
    (转)C#连接OleDBConnection数据库的操作
    c# DLL封装并调用
    网络cmd命令
    (转)UCOSII在任务切换与出入中断时堆栈指针的使用
    app和bootloader跳转 MSP与PSP
    (转)stm32启动文件详解
  • 原文地址:https://www.cnblogs.com/jackge/p/3019051.html
Copyright © 2020-2023  润新知