社区讨论

求助

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo11x88k
此快照首次捕获于
2023/10/22 13:51
2 年前
此快照最后确认于
2023/11/02 13:21
2 年前
查看原帖
题目:

Background

输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。
例如 1,3,5,1,2,31,-3,5,1,-2,3
m=4m=4时,S=5+12+3=7S=5+1-2+3=7m=2m=2m=3m=3时,S=5+1=6S=5+1=6

Input

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

Output

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

Samples

INPUT1
6 4
1 -3 5 1 -2 3
OUTPUT1
7

Limitation

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

我的代码:
CPP
#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;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...