思路:对前缀和排序,求相邻前缀和差的最小值和每个前缀和的最小值。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int MAXN = 50005;
struct node{
LL sum;
int k;
bool operator < (const node &a)const{
return a.sum>sum;
}
}a[MAXN];
int main()
{
int n;
scanf("%d", &n);
LL x;
a[0].sum=0,a[0].k=0;
for(int i=1;i<=n;++i)
{
scanf("%lld", &x);
a[i].sum=a[i-1].sum+x;
a[i].k=i;
}
sort(a+1, a+n+1);
LL ans=inf;
for(int i=1;i<=n;++i)
{
if(a[i].sum>0)
ans=a[i].sum<ans?a[i].sum:ans;
if(a[i].k>a[i-1].k&&a[i].sum-a[i-1].sum>0)
ans=min(a[i].sum-a[i-1].sum, ans);
}
printf("%lld\n", ans);
return 0;
}