最大连续和(单调队列)

区间连续和——考虑前缀和

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n,m;
int s[300090];
int q[300090];
int main() {
	int x;
	int ans=-0xfffffff;
	scanf ("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf ("%d", &x);
		s[i] = s[i - 1] + x;
	}
	for (int i = 1; i <= n; i++) 
		for (int j = i - m; j < i; j++) 
			ans = max (ans, s[i]-s[j]);
	printf ("%d", ans);
	return 0;
	
}

两层循环非吾愿 单调队列化二层循环

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n,m;
int s[300090];
int q[300090];
int num[300090];
int main() {
	int x;
	int head = 1, tail = 1; 
	int ans = -0xfffffff;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		s[i] = s[i - 1] + x;
	}
	for (int i = 1; i <= n; i++) {
		while(head<=tail&&num[head]<i-m) head++;
		ans = max (ans, s[i] - q[head]);
		while(q[tail] >= s[i]&&head <= tail) tail--;
		q[++tail] = s[i];
		num[tail] = i;
	} 	
	printf("%d", ans);
	return 0;
	
}

此题与上题相似

上题m个里取1个 队列存前m个的最小值 +w[i]

此题连续取m个  队列存前m个的前缀和最小值 w[i]-..

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值