Codeforces Round #481 (Div. 3) E. Bus Video System

题目链接
题意:
给n个车站,和一辆载人数为w的公交车。给出到达每个车站之后,车上的人的变化数量。问:最初车上有多少情况(多少人数),如果没有一种情况符合,或者说给出的数据是矛盾的,输出0。
思路
既然载人数为w,那先啥都不管,最初可能有(0,1,2,3,4,5…w)中情况(最初的车上的人数)。那么我们知道,这么多种情况肯定有些是不符合的,比如经过第一个车站后,车上人数变化为-3,那么车上至少要有三个人。(不可能最初车上还负着人数叭)。那么只用求出其变化的前缀和。为什么呢?其前缀和的最小值,就是最初车上人数的最大限制条件(比如前5个车站人数变化-1000,那么最开始车上必须至少有1000人),同理,我们找出最大前缀和,这也是一个最大的限制条件。因为如果前5个前缀和为1000,载人数为1001,那么最初车上只可能有1个人,或者没有人。

最大的坑点来了,最小值不一定为负,最大值不一定为正。。。。。。所以我wa了
AC代码

#include <bits/stdc++.h>
using namespace std;
#define NewNode (ListNode *)malloc(sizeof(ListNode))
#define Mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5 + 50;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const unsigned long long mod = 998244353;
const int II = 3.1415926535;
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int,int> pii;
ll arr1[5000] = {0},arr2[5000] = {0};
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    ll n,w;
    cin >> n >> w;
    for(int i = 0;i < n;i++)
    {
        cin >> arr1[i];
        arr2[i] += arr1[i];
        arr2[i] += arr2[i-1];//前缀和数组
    }
    ll Max = -INF,Min = INF;
    for(int i = 0;i < n;i++)
        Max = max(Max,arr2[i]),Min = min(Min,arr2[i]);
    if(Max > w || abs(Min) > w)
        cout << 0 << endl;
    else
    {
        int sum = w+1;//最开始一共w+1种情况
        if(Max >= 0)
            sum = sum-Max;
        if(Min < 0)
            sum += Min;
        if(sum <= 0)
            cout << 0 << endl;//还要判断一次,不然凉凉,有可能为负
        else
            cout << sum << endl;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值