最小正字段和

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;
}
原文地址:https://www.cnblogs.com/naruto-mzx/p/11675617.html