#include

ZZUN Minsum Plus 最小正字段和

D : Minsum Plus

 
Progress Bar

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

 

posted @ 2018-05-20 23:29  0一叶0知秋0  阅读(189)  评论(0编辑  收藏  举报