P2629 好消息,坏消息

 

题目描述

uim在公司里面当秘书,现在有n条消息要告知老板。每条消息有一个好坏度,这会影响老板的心情。告知完一条消息后,老板的心情等于之前老板的心情加上这条消息的好坏度。最开始老板的心情是0,一旦老板心情到了0以下就会勃然大怒,炒了uim的鱿鱼。

uim为了不被炒,知道了了这些消息(已经按时间的发生顺序进行了排列)的好坏度,希望研究如何不让老板发怒。

uim必须按照时间的发生顺序逐条将消息告知给老板。不过uim可以使用一种叫“倒叙”的手法,例如有n条消息,小a可以从k,k+1,k+2...n,1,2...k-1这种顺序通报。

他希望知道,有多少个k,从k开始通报到n然后从1通报到k-1可以让老板不发怒。

输入输出格式

输入格式:

 

第一行一个整数n(1 <= n <= 10^6),表示有n个消息。

第二行n个整数,按时间顺序给出第i条消息的好坏度Ai(-1000 <= Ai <= 1000)

 

输出格式:

 

一行一个整数,表示可行的方案个数。

 

输入输出样例

输入样例#1:
4
-3 5 1 2 
输出样例#1:
2

说明

样例解释

[5 1 2 -3]或[1 2 -3 5]

对于25%数据n<=1000

对于75%数据n<=10000

对于100%数据n<=10^6

 

数据范围N*N去搜,肯定不行。

那就预处理一遍,前缀最小值,部分区间的的前缀最小值

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n,ans;
int tot=0;
int f1[2000009],f2[3000009];
int sum[2000009],a[2000009];
int main()
{
    scanf("%d",&n);
    f1[0]=99999999;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);tot+=a[i];
        f1[i]=min(f1[i-1],tot);
    }
    sum[n]=a[n];f2[n]=a[n];    
    for(int i=n-1;i>=1;i--)
    {
        sum[i]=sum[i+1]+a[i];
        f2[i]=min(a[i],f2[i+1]+a[i]);
    }
    f1[0]=0;
    for(int i=1;i<=n;i++)
    if(f2[i]>=0&&sum[i]+f1[i]>=0)    ans++;
    cout<<ans;
}
View Code

 

有技巧的搜索

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n,ans;
int tot=0;
int zhan[2000000],a[2000000],top;
int main()
{
    scanf("%d",&n);
       for(int i=1;i<=n;i++)
           scanf("%d",&a[i]);
       for(int k=1;k<=n;k++)
       {
           zhan[++top]=a[k];
           while(zhan[top]<0 && top>1)
           {
               top--;
               zhan[top]+=zhan[top+1];
               zhan[top+1]=0;
           }
           while(zhan[top]<0)
           {
               zhan[top]+=a[n--];
               if(n<k)
               {
                   printf("0");
                   return 0;
               }
           }
       }
       cout<<top;
       return 0;
}
View Code

 

posted @ 2017-08-11 09:59  浪矢-CL  阅读(327)  评论(0编辑  收藏  举报