****连续区间最大和
tmp:当前的区间和 maxn:当前的最大区间和 sum:所有元素的和
如果是链式队列:每次tmp加上一个元素,然后 max(maxn,tmp)更新当前的最大区间和。
如果 tmp<0 tmp=0 清零操作
如果是环形队列:在链式队列的基础上 以同样的方式求出连续区间的最小值。然后sum-minn
就是除去最小区间和后的最大连续区间值,再与maxn进行比较 ans=max(maxn,sum-minn)
ans就是最后的结果。
js客: A2232 程序设计:蒜厂年会
#include<algorithm>
#include<queue>
#include<iostream>
#include<cmath>
#include<math.h>
#include<stack>
#include<stdio.h>
#include<vector>
#include<string.h>
#define ll long long
using namespace std;
const int mx=1e5+10,inf=1e9;
int a[mx],n;
ll sum=0;
int main()
{
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
ll maxn=a[0],minn=a[0],t1=0,t2=0;
for(int i=0;i<n;i++){
t1+=a[i];
t2+=a[i];
maxn=max(maxn,t1);
minn=min(minn,t2);
if(t1<0) t1=0;
if(t2>0) t2=0;
}
printf("%lld\n",max(maxn,sum-minn));
return 0;
}