码迷,mamicode.com
首页 > 其他好文 > 详细

ZZUN Minsum Plus 最小正字段和

时间:2018-05-21 00:56:42      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:space   mib   一个   inf   contest   des   正数   正整数   prim   

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;
    }

 

ZZUN Minsum Plus 最小正字段和

标签:space   mib   一个   inf   contest   des   正数   正整数   prim   

原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/9065185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!