最大子序和

最大子序和

http://www.nowcoder.com/questionTerminal/3d0919b699fc4567ab3435b19929aace

https://ac.nowcoder.com/acm/contest/1006/D
【题目】
输入一个长度为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,m≤300000)
第二行有n个数,要求在n个数找到最大子序和
输出:一个数,数出他们的最大子序和

思路:有些人用的单调队列写的,我在这介绍一下我的想法。直接暴力加贪心,首先枚举一段连续子序列的起点,
利用贪心求出从起点连续的最大和,注意地方直接看代码;反之break;因为你每次需要的序列必然是连续的,当不符合时,可以再枚举起点的时候进行操作,不必重复操作。

#define first f
#define second s
#define ll long long
#define mp make_pair
#define pb push_back
#include<bits/stdc++.h>
#define pii pair<ll,ll>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn=3e5+5;

int a[maxn];

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    ll sum=0,mx=-1e17;
    for(int i=1;i<=n;i++){
        sum=0;
        for(int j=i,k=0;k<m&&j+k<=n;k++){
            if(sum+a[j+k]>=a[j+k]){
                sum+=a[j+k];
                mx=max(mx,sum);
            }
            else{sum=a[j+k];mx=max(mx,sum);}
        }
    }
    cout<<mx<<endl;
    return 0;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务