ZZUN Minsum Plus 最小正字段和
D : Minsum Plus
时间限制:1 Sec 内存限制:128 MiB
提交:344
答案正确:71
题目描述
题意简单到令人发指!
序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值.
将这个值输出,若无解,输出no solution。
输入
第一行输入一个正整数N(2<N<50000)
第二行输入N个整数
输出
输出最小的正子段和
样例输入
复制
3 -1 2 3
样例输出
复制
1
#include <iostream> #include <algorithm> using namespace std; const int N = 50100; typedef struct point { int i; long long sum; }Point; Point a[50100]; bool cmp(Point A, Point B) { return A.sum < B.sum; } int main() { int n; cin >> n; long long temp; long long ans = 100000000000000000; a[0].sum = 0; a[0].i = 0; for(int i=1; i<=n; i++) { cin >> temp; if(temp > 0 && temp < ans) { ans = temp; } // 求出前缀和 在后面打乱和的位置 找出最小的正整数和 a[i].i = i; a[i].sum = a[i-1].sum + temp; } sort(a, a+n+1, cmp); for(int i=1; i<=n; i++) { if(a[i].i > a[i-1].i && a[i].sum-a[i-1].sum > 0 && a[i].sum-a[i-1].sum < ans) { ans = a[i].sum - a[i-1].sum; } } if(ans < 100000000000000000) { cout << ans << endl; } else { cout << "no solution" << endl; } return 0; }