码迷,mamicode.com
首页 > 其他好文 > 详细

P2629 好消息,坏消息

时间:2017-08-11 11:02:58      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:cst   顺序   前缀   str   log   main   clu   方案   ios   

题目描述

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;
}

 

P2629 好消息,坏消息

标签:cst   顺序   前缀   str   log   main   clu   方案   ios   

原文地址:http://www.cnblogs.com/CLGYPYJ/p/7344309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!