[51nod1065]最小正子段和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[50002];
struct node{
    ll sum,idx;
}nn[50002];
const ll inf=1ll<<61;
bool cmp(const node &a,const node &b){
    return a.sum<b.sum||(a.sum==b.sum&&a.idx<b.idx);
}
int main(){
    ll n,ans=inf;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],nn[i].sum=nn[i-1].sum+a[i],nn[i].idx=i;
    sort(nn,nn+n+1,cmp);
    for(int i=1;i<=n;i++){
        if(nn[i].sum>0){
            ans=min(ans,nn[i].sum);
        }
        if(nn[i].sum>nn[i-1].sum&&nn[i-1].idx<nn[i].idx){
            ans=min(ans,nn[i].sum-nn[i-1].sum);
        }
    }
    cout<<ans<<"\n";
    return 0;
}
时间: 2024-10-10 22:24:24

[51nod1065]最小正子段和的相关文章

51nod-1065 最小正子段和 【贪心 + 思维】

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示

51nod-1065:最小正子段和(STL)

N个整数组成的序列a11,a22,a33,…,ann,从中选出一个子序列(aii,ai+1i+1,…ajj),使这个子序列的和>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输出最小正子段和.Sample Input 8 4 -1 5 -2 -1 2 6 -2 Sample Outp

AC日记——最小正子段和 51nod 1065

最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 50005 #define ll long long #define INF 0x7fffffff str

51nod 1065 最小正子段和

题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 50001; 6 const int inf = 0x3f3f3f3f; 7 pair<long long, int> sum[N]; 8 int

最小正子段和

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,是最小的. 收起 输入 第1行:整数序列的长度N(2 <= N <= 50000) 第2 - N+1行:N个整数 输出 输出最小正子段和. 输入样例 8 4 -1 5 -2 -1 2 6 -2 输出样例 1 思路: 虽然说

1065 最小正子段和 二分答案 + 判定

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065 我的思路比较笨,我是直接二分那个答案mid 然后进行一次O(nlogn)的判定,如果能找到一个区间的和比mid小的,(当然这个区间的和也是要大于0),那就return true 进行判断如下: 处理出前缀和dp[i],对于每一个i 目标是:在前i - 1个中,查看是否有这样的一个x,使得,dp[i] - x    <=   mid,&& dp[i] -

51nod 1065 最小正子段和 (贪心)

题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&&data[i-1].val<data[i].val:就更新最小值,因为是相近的,所以已经是最小值候选了,其余的绝对不可能了.那么为什么只考虑相邻的呢?因为如果A到B不能形成队列,A到C形成队列了,那么B到C一定是比A到C的数值更小,而且还一定能够形成队列(A与B不能形成队列,说明posA>posB

51Node 1065----最小正子段和

51Node  1065----最小正子段和 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

最大子序列和,最小子序列和,最小正子序列和,最大子序列乘积

来自:<数据结构与算法分析——C语言描述>练习2.12 一. 最大子序列和 1.穷举法,O(N3) 1 int maxSequenceSum1(const int A[], int N) 2 { 3 int i, j, k, maxSum, thisSum; 4 5 maxSum = 0; 6 for (i = 0; i < N; i++) 7 { 8 for (j = i; j < N; j++) 9 { 10 thisSum = 0; 11 for (k = i; k <