WA#3,评论区所有hack均过,没有思路相同的题解,问思路正确性
查看原帖
WA#3,评论区所有hack均过,没有思路相同的题解,问思路正确性
977904
Zhong_Yixuan楼主2025/2/8 01:10

思路

最大字段和的标准代码(为防止题解过多好心人找不到,见下第一个代码)上稍作改进,若 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;
}
2025/2/8 01:10
加载中...