UPDATE 2023-08-15:修改代码
UPDATE 2023-08-09 : 修复LaTeX公示
Description
给你一个长度为 n 的整数序列,要求从中找出一段连续的长度不超过 m 的非空子序列,使得这个序列的和最大。
Input
第一行为两个整数 n,m;
第二行为 n 个用空格分开的整数序列,每个数的绝对值都小于 1000。
Output
仅一个整数,表示连续长度不超过 m 的最大非空子序列和。
Sample Input
6 4
1 -3 5 1 -2 3
Sample Output
7
HINT
对于 50% 的数据,;
对于 100% 的数据,。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
long long s[N], a[N], q[N];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
s[i] = s[i - 1] + a[i];
}
long long maxn = -1e9;
int head = 0, tail = 0;
for (int i = 1; i <= n; i++)
{
while (head <= tail && q[head] + m < i)head++; //如果区间大于m,将队头出队。
maxn = max(maxn, s[i] - s[q[head]]); //判断区间最大和
while (head <= tail && s[q[tail]] >= s[i])tail--; //如队尾元素大于插入元素,为保持队列单调递增,队尾出列
q[++tail] = i; //记录插入元素的下标
}
cout << maxn;
return 0;
}