输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。
注意: 子序列的长度至少是 1。
输入格式
第一行输入两个整数 n,m。
第二行输入 n 个数,代表长度为 n 的整数序列。
同一行数之间用空格隔开。
输出格式
输出一个整数,代表该序列的最大子序和。
#include<bits/stdc++.h>
using namespace std;
int s[1000001]={0};
deque<int>q;
int main()
{
int n,d,m,ans=INT_MIN;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>d;
s[i]=s[i-1]+d;
}
q.push_back(0);
for(int i=1;i<=n;i++)
{
while(q.size()&&i-q.front()>m)q.pop_front();
ans=max(ans,s[i]-s[q.front()]);
while(q.size()&&s[q.back()]>s[i])q.pop_back();
q.push_back(i);
}
cout<<ans;
return 0;
}
//和其相邻最小的一个。