前缀和-给恐暴龙喂食

简介: 前缀和-给恐暴龙喂食
题目描述

暴恐龙每天都需要吃 N 个食物。为了营养均衡,饲养员也会投喂一些恐暴龙不爱吃的食物。好吃的食物会增加心情值,不好吃的会减少。当心情值少于 0 时(恐暴龙心情值初始为 0),恐暴龙会将饲养员吃掉。 为了避免被吃,饲养员可以选择从中间开始喂食,例如:有 N 个食物,饲养员可以从k,k+1,k+2...N,1,2...k-1 这种顺序喂食。 饲养员想要直到有多少种 K,从 K 开始喂到 N 然后从 1 喂食到 K-1 可以避免自己不被吃掉。


输入输出格式
输入格式

第一行有一个整数 N,表示有 N 个食物。 第二行有 N 个整数,按顺序给出第 i 个食物喂食后所能导致的心情值变化 ai。数据中间用一个空格隔开。

输出格式

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

输入输出
样例1

输入: 4 -3 5 1 2

输出: 2

解释:[5 1 2 -3][1 2 -3 5] 两种情况。

样例2

输入: 6 2 -3 5 5 -4 -5

输出: 1

说明提示

1≤N≤106 −100≤ai≤1000

代码:
#include<bits/stdc++.h>
 
using namespace std;
const int maxn = 1000005;
int n;
int a[maxn], b[maxn];
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {//维护前缀和
    cin >> a[i];
    if (i == 1) {
      b[i] = a[i];
    } else {
      b[i] = b[i - 1] + a[i];
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {//遍历n个食物(第几个食物作为k)
    int flag = 0;
    int u = i - 1;
    int uu = 0;
    for (int j = i; j <= n; j++) {//k~n:此时心情为(第j个食物前缀和-第k-1个食物前缀和)
      if (b[j] - b[u] < 0) {
        flag = 1;
        break;
      }
      if (flag == 0 && j == n) {
        uu = b[n] - b[u];//记录吃到第n个食物时的心情值
      }
    }
    if (flag == 0) {
      for (int j = 1; j <= i - 1; j++) {//1~k-1:此时心情为(吃到第n个食物时的心情+第j个食物前缀和)
        if (uu + b[j] < 0) {
          flag = 1;
          break;
        }
 
      }
      if (flag == 0) {
        ans++;
      }
 
    }
  }
  cout << ans;
}


相关文章
|
5天前
|
算法
【算法】前缀和——前缀和
【算法】前缀和——前缀和
|
5天前
|
算法
【算法】前缀和——二维前缀和模板题
【算法】前缀和——二维前缀和模板题
|
11月前
|
人工智能 移动开发
【前缀和】
【前缀和】
|
5天前
|
算法 C++
【算法】前缀和算法——和可被K整除的子数组
【算法】前缀和算法——和可被K整除的子数组
|
5天前
|
算法
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积
|
3月前
|
机器学习/深度学习 存储 算法
【算法系列篇】前缀和-2
【算法系列篇】前缀和-2
|
3月前
|
存储 算法 Java
【算法系列篇】前缀和-1
【算法系列篇】前缀和-1
|
3月前
|
存储 算法
前缀和算法模板
前缀和算法模板
|
3月前
|
人工智能 移动开发
前缀和讲解
前缀和讲解
22 0
|
3月前
[leetcode 前缀和]
[leetcode 前缀和]