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

      记得以前好像做过,应该是学长给了个思路才想出来的,明明是一道水题,写了半天全是错的,给自己留个纪念吧,思路很简单:把数组复制一遍接到数组后面,先求最大值

    ,要是直接求的话肯定错,个数要限制一下,给个例子:4 5 6 7 ,复制之后是 4 5 6 7 4 5  6 7 要是没有个数限制的话就全加上了,之后这个先来一个候选值,因为不一定对

    例子是: 1 2 3  -5 3  2 1,自己跑一遍的话可以知道是3 + 2 + 1 + 1 + 2 + 3之前写的会全加上,这个就要另一个思路了,就是反其道而行,找序列中连续最小的然后不要了,感觉很

    神奇,这两个候选值选一个最大的就可以了。

    代码:

      

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    #include<math.h>
    #include<vector>
    #include<queue>
    using namespace std;
    typedef long long ll;
    int x[500000];
    int main()
    {
        int n;
        scanf("%d",&n);
        ll fuck=0;
        for(int i=0;i<n;i++){
            scanf("%d",&x[i]);
            x[n+i]=x[i];
            fuck+=x[i];
        }
        //for(int i=0;i<n*2;i++)  printf("%d
    ",x[i]);
        ll maxx=0;
        ll sum=0;
        int ge=0;
        for(int i=0;i<n*2;i++){
            if(x[i]+sum>0){
                sum+=x[i];
                maxx=max(maxx,sum);
                ge++;
                if(ge==n){
                    sum=0;
                    ge=0;
                }
            }
            else{
                sum=0;
                ge=0;
            }
        }
        maxx=max(sum,maxx);
        ll haha=maxx;
        maxx=0;
        ge=0;
        sum=0;
        for(int i=n*2-1;i>=0;i--){
            if(x[i]+sum>0){
                sum+=x[i];
                maxx=max(maxx,sum);
                ge++;
                if(ge==n){
                    sum=0;
                    ge=0;
                }
            }
            else{
                sum=0;
                ge=0;
            }
        }
        maxx=max(maxx,sum);
        haha=max(maxx,haha);
        ll minn=10000000000;
        sum=0;
        for(int i=0;i<n*2;i++){
            if(x[i]+sum<0){
                sum+=x[i];
                minn=min(minn,sum);
                ge++;
                if(ge==n){
                    sum=0;
                    ge=0;
                }
            }
            else{
                sum=0;
                ge=0;
            }
        }
        ll lala=minn;
        minn=10000000000;
        sum=0;
        for(int i=n*2-1;i>=0;i--){
            if(x[i]+sum<0){
                sum+=x[i];
                minn=min(minn,sum);
                ge++;
                if(ge==n){
                    sum=0;
                    ge=0;
                }
            }
            else{
                sum=0;
                ge=0;
            }
        }
        lala=min(minn,lala);
        fuck-=lala;
        haha=max(haha,fuck);
        printf("%lld
    ",haha);
        return 0;
    }
  • 相关阅读:
    Thinkphp中自己组合的数据怎样使用框架的分页
    CI框架不能有Index控制器
    购物车,修改数量错误
    TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement.
    OAuth2.0
    通过控制面板查看时间日志
    js再学习笔记
    Thinkphp验证码异步验证第二次及以后验证,验证错误----待解决
    cookie&&session再理解笔记
    markdown语法学习笔记
  • 原文地址:https://www.cnblogs.com/fzw1523/p/10659509.html
Copyright © 2011-2022 走看看