• 2016 Multi-University Training Contest 5 Divide the Sequence


    Divide the Sequence

    题意:

    给你一个序列A,问你最多能够分成多少个连续子序列,使得每个子序列的所有前缀和均不小于0

    题解:

    这题是比赛时候的水题,但我比的时候也就做出这一题, = =
    首先我想的是把他们前缀和求出来,之后试了下样例,一点鸟用都没有,那正着不行就倒着试下呗,之后发现这样有用,我先想到的思路是求后缀和,只要>=0就ans++,但那时队友举出了反例,比如2 1 -3 3的时候应该是2,我的算法就是4,那接着马上就能想到如果后缀和大于0,那么就要把他赋为0,之后举了几组例子,没问题,写了几分钟,之后1A。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    const int INF=0x3f3f3f3f;
    const ll LINF=0x3f3f3f3f3f3f3f3f;
    #define PI(A) cout<<A<<endl
    #define SI(N) cin>>N
    #define SII(N,M) cin>>N>>M
    #define cle(a,val) memset(a,(val),sizeof(a))
    #define rep(i,b) for(int i=0;i<(b);i++)
    #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
    #define dbg(x) cout <<#x<<" = "<<x<<endl
    #define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
    #define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
    const double EPS= 1e-9 ;
    
    /*  /////////////////////////     C o d i n g  S p a c e     /////////////////////////  */
    
    const int MAXN= 1000000 + 9 ;
    
    ll a[MAXN];
    int N;
    
    int main()
    {
        iostream::sync_with_stdio(false);
        cin.tie(0),cout.tie(0);
        while(SI(N))
        {
            ll ans=0;
            rep(i,N) SI(a[i]);
            ll sum=0;
            reRep(i,N-1,0)
            {
                sum+=a[i];
                if (sum>=0) sum=0;
                if (sum==0) ans++;
            }
            PI(ans);
        }
        return 0;
    }
  • 相关阅读:
    小错误
    创建表空间
    mysql
    myeclipse
    linux命令小结
    jquery
    java基础
    【学习笔记】【多项式】多项式插值相关_个人学习用
    SHUoj 神无月排位赛
    SHUoj 字符串进制转换
  • 原文地址:https://www.cnblogs.com/s1124yy/p/5733375.html
Copyright © 2020-2023  润新知