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 <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <limits.h>
using namespace std;
struct Node
{
int index;
long long int sum;
Node(int i, long long int s)
{
index = i;
sum = s;
}
};
bool comp(const Node &left, const Node &right)
{
if (left.sum < right.sum)
{
return true;
}
else if (left.sum == right.sum)
{
return left.index > right.index;
}
return false;
}
void fun(vector<Node> &input)
{
sort(input.begin(), input.end(), comp);
int result = INT_MAX;
for (int i = 1; i < input.size(); i++)
{
if (input[i].sum > input[i-1].sum)
{
int temp = input[i].sum - input[i-1].sum;
if ((input[i].index > input[i-1].index) && (temp < result))
{
result = temp;
}
}
}
cout << result << endl;
}
int main()
{
int N;
cin >> N;
vector<Node> input;
int a;
long long int sum = 0;
input.push_back(Node(0, 0));
for (int i = 0; i < N; i++)
{
cin >> a;
sum += a;
input.push_back(Node(i+1, sum));
}
fun(input);
return 0;
}