BNU

题意:给出一个数序列,求符合要求的种数,条件是:新的序列前i个之和>=0,(1<=i<=n)。

题解:预处理。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <cmath>
#include <map>
#define MAXN 1111111
#define MAXM 400005
#define INF 2000000007
using namespace std;
int n;
int sum1[MAXN], sum2[MAXN];
int mi[MAXN], mx[MAXN];
int a[MAXN];
int main()
{
    while(scanf("%d", &n) != EOF &&n)
    {
        memset(sum1, 0, sizeof(sum1));
        memset(sum2, 0, sizeof(sum2));
        for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
        for(int i = 1; i <= n; i++) sum1[i] = sum1[i - 1] + a[i];
        for(int i = n; i >= 1; i--) sum2[i] = sum2[i + 1] + a[i];
        mi[0] = INF;
        mx[n + 1] = -INF;
        for(int i = 1; i <= n; i++)
        {
            mi[i] = mi[i - 1];
            mi[i] = min(mi[i], sum1[i]);
        }
        for(int i = n; i >= 1; i--)
        {
            mx[i] = mx[i + 1];
            mx[i] = max(mx[i], sum2[i]);
        }
        int ans = 0;
        if(mi[n] >= 0) ans++;
        for(int i = 1; i < n; i++)
        {
            bool flag = 1;
            if(sum2[i + 1] - mx[i + 1] < 0) flag = 0;//后面的数之和-后面出现的后几项出现的最大值。
            if(sum2[i + 1] + mi[i] < 0) flag = 0;
            if(flag) ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(BNU)