最小正子段和
对前缀和由小到大排序,在相邻位置的差中一定存在最终结果。
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct node
{
long long val;
int pos;
};
node a[50005];
bool cmp(node a,node b)
{
if(a.val==b.val)
return a.pos>b.pos;
else
return a.val<b.val;
}
int main()
{
long long ans;
while(cin>>n)
{
a[0].val=0;
a[0].pos=0;
for(int i=1;i<=n;i++)
{
cin>>a[i].val;
a[i].val+=a[i-1].val;
a[i].pos=i;
}
sort(a,a+1+n,cmp);
ans=0;
for(int i=1;i<=n;i++)
{
if(a[i].pos>a[i-1].pos&&a[i].val>a[i-1].val)
{
if(ans==0)
ans=a[i].val-a[i-1].val;
else
ans=min(ans,a[i].val-a[i-1].val);
}
}
cout<<ans<<endl;
}
return 0;
}
最小字段和
最大连续子段和