hdu4193

/*
分析:
    数据结构的分析类问题。
    觉得是道挺有意思的水题,本来没想发,不过随便搜了下后发现清一色的单调队列。。
应该很快也要退役了,还是发下吧。。
    这里说的移动,都是将最后一个元素放到首位。
    1.如果sum<0,那么坑定ans=0;
    2.很容易发现一个性质,如果当前的长度为n的序列满足题中的那个条件,那么我们可以
只将最后一个元素移动到最前面;既将最后的元素放到首位,如果之前的序列满足条件,则
此次移动后得到的序列是否满足情况,全权由此元素决定(因为不考虑这次移动后的首元素,
其后的n-1个元素所组成的序列,一定满足题中条件):
    如果这个元素>=0,那么这次移动得到的新队列同样满足题中的条件;
    如果这个元素<0,那么可以设置一个量来累加这个值,直到某次移动移动后这个累计
值>=0,此时ans可以+1,并且要把这个累计值清零。
    再详细的看代码吧,很短。至于单调队列?啥东西囧~?估计也就我这种非计算机专业
的半吊子会这样搞吧。。还是赶紧抽段时间恶补计算机的东西吧。。。

转载。。请声明:--------------------Ice_Crazy(见鬼,这玩意儿谁会转载。。)
    
                                                                     2013-07-31
*/







#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
const int N=1000006;

int n,num[N],ans;
int main()
{
    int i,l;
    int p,acc,sum,cnt;
    while(scanf("%d",&n),n)
    {
        sum=0;
        for(i=0;i<n;i++){scanf("%d",&num[i]);sum+=num[i];}
        if(sum<0)    {printf("0\n");continue;}

        p=n-1;
        ans=cnt=sum=0;
        while(cnt<=p)
        {
            sum+=num[cnt++];
            while(sum<0)    sum+=num[p--];
        }
        acc=0;
        while(p>=0)
        {
            if(acc>=0)        ans++;
            if(acc<0)        acc+=num[p];
            else if(num[p]<0)    acc=num[p];
            p--;
        }
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(hdu4193)