zoukankan      html  css  js  c++  java
  • 51nod 1050 循环数组最大子段和

    来源:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050

    答案有两种形式1.正常的最大连续序列 即ans1

            2.开始+末尾的连续的一段,去掉中间,中间为什么去掉呢,因为中间那段和为负数,只要求出负数最大的连续子序列去掉就行了 然后这种情况只要 sum +ans2

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 5e4+10;
    int a[maxn],b[maxn],n;
    typedef long long ll;
    
    ll solve (int *s)
    {
        ll ans =0,res =0;
        for(int i=0;i<n;i++)
        {
            ans+=s[i];
            res = max(res,ans);
            if(ans < 0)
                ans =0;
        }
        return res;
    }
    
    int main ()
    {
    
        scanf("%d",&n);
        ll res=0;
        for(int i=0;i<n;i++)
        {
             scanf("%d",&a[i]);
             b[i] = -a[i];
             res += a[i];
        }
        ll ans1= solve(a),ans2=solve(b);
        res= max(ans1,res+ans2);
        printf("%lld
    ",res);
        return 0;
    }
  • 相关阅读:
    第三周助教总结
    第三周作业
    第二周助教总结
    参数和指针
    第二周作业
    第一周作业 2
    第一周作业 1
    第七周助教小结
    第六周助教小结
    第五周助教总结
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7356707.html
Copyright © 2011-2022 走看看