51nod 1065 最小正子段和

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
 收藏
 关注
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,是最小的。
 
Input
第1行:整数序列的长度N(2 <= N <= 50000)
第2 - N+1行:N个整数
Output
输出最小正子段和。
Input示例
8
4
-1
5
-2
-1
2
6
-2
Output示例
1
相关问题
 
前缀和 + 排序 
#include <algorithm>
#include <cstdio>

using namespace std;
int n;
long long minx=1e18;
long long min(long long a,long long b)
{
    return a>b?b:a;
}
struct node
{
    long long zdh;
    int pos;
    bool operator<(node a)const
    {
        if(zdh!=a.zdh) return zdh<a.zdh;
        else return pos<a.pos;
    }
}sum[50050];
int main()
{
    scanf("%d",&n);
    for(int a,i=1;i<=n;i++)
    {
        scanf("%d",&a);
        sum[i].zdh=sum[i-1].zdh+a;
        sum[i].pos=i;
    }
    sort(sum+1,sum+1+n);
    if(sum[1].zdh>=1) minx=sum[1].zdh;
    for(int i=2;i<=n;i++)
    {
        if(sum[i].zdh>=1) minx=min(minx,(long long)sum[i].zdh);
        if(sum[i].pos>sum[i-1].pos&&sum[i].zdh-sum[i-1].zdh>=1)
        minx=min(minx,sum[i].zdh-sum[i-1].zdh);
    }
    printf("%lld",minx);
    return 0;
}

 

posted @ 2017-04-21 21:23  杀猪状元  阅读(148)  评论(0编辑  收藏  举报