求助
  • 板块学术版
  • 楼主__zyy_wgcs__
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/16 21:44
  • 上次更新2023/11/2 13:21:39
查看原帖
求助
995895
__zyy_wgcs__楼主2023/10/16 21:44

题目:

Background

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

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

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

Input

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

Output

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

Samples

6 4
1 -3 5 1 -2 3
7

Limitation

100%100\%满足n,m<=300000n,m<=300000


我的代码:

#include<cstdio>
using namespace std;
long long n,m;
long long a[300010]; 
long long f[300010];
long long step[300010];
long long max(long long a,long long b){
	return (a>b)?a:b;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		f[i]=a[i];
		step[i]=1;
	} 
	long long maxx=-0x7fffffff;
	for(long long i=1;i<=n;i++){
		if(f[i-1]>0){
			f[i]+=f[i-1];
			step[i]+=step[i-1];
		}
		if(step[i]>m){
			step[i]--;
			f[i]-=a[i-step[i]];
		}
		if(f[i]>maxx){
			maxx=f[i];
		}
	}
	printf("%lld",maxx);
	return 0;
}
2023/10/16 21:44
加载中...