N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子段(a[i],a[i+1],…a[j]),使这个子段的和>0,并且这个和是所有和>0的子序列中最小的。
例如:4,-1,5,-2,-1,2,6,-2。-1,5,-2,-1,序列和为1,是最小的。
输入
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数
排序后,一个数字只有和它相邻数的差或者它本身为最小值,代码还是很好写的!
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
#define int long long
struct node{
int sum,id;
}e[N];
bool cmp(node t1,node t2){
return t1.sum<t2.sum;
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&e[i].sum);
e[i].sum+=e[i-1].sum;
e[i].id=i;
}
sort(e+1,e+1+n,cmp);
int ans;
if(e[1].sum>0)ans=e[1].sum;
else ans=1e9;
for(int i=2;i<=n;i++){
if(e[i].sum>0)ans=min(ans,e[i].sum);
if(e[i].sum>e[i-1].sum&&e[i].id>e[i-1].id)
ans=min(ans,e[i].sum-e[i-1].sum);
}
cout<<ans<<endl;
}