思路
在最大字段和的标准代码(为防止题解过多好心人找不到,见下第一个代码)上稍作改进,若 r 与 l 之差大于 m 则使 l++ ,否则令 r 右移
感觉上思路没有任何问题,求指出错误或hack
code1
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){
ll ref=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) ref=ref*10+ch-48,ch=getchar();
return ref*f;
}
int main(){
ll n=read(),ma=-1e+9,sum=0;
while(n--){//n,n-1,n-2…
int temp=read();
sum+=temp;
ma=max(ma,sum);
if(sum<0) sum=0;
}cout<<ma;
return 0;
}
code2
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[(ll)5e+5+5];
inline ll read(){
ll ref=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) ref=(ref<<3)+(ref<<1)+ch-48,ch=getchar();
return ref*f;
}
int main(){
ll n=read(),m=read(),sum=0,ans=0,ma=-1e+9;
ll l=0,r=0;
for(ll i=0;i<n;i++) a[i]=read(),ma=max(ma,a[i]);
if(ma<0){
cout<<ma;
return 0;
}while(l<n){
while(r<n&&r<l+m){
sum+=a[r++];
if(sum<=0) l=r,sum=0;
ans=max(ans,sum);
}sum-=a[l++];
if(sum<=0) l=r,sum=0;
}cout<<ans;
return 0;
}