基准时间限制: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; }