树上有猴(模拟)

一棵大树上初始时有若干个猴子(也可能没有)。

接下来 nn 个时刻,每个时刻树上猴子的数量都会发生变动。

第 ii 时刻的变动数量为 ai,ai>0 表示有 ai 只猴子上了树,ai<0 表示有 |ai| 只猴子下了树。

已知,在任意时刻树上的猴子总数都没有超过 w,当然也不可能小于 0。

请问,初始时的猴子数量共有多少种可能性?

例如,当 n=3,w=5且 a1=2,a2=1,a3=−3时,初始时的猴子数量可能为 0,1,2个。

输入格式

第一行包含两个整数 n,w。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

一个整数,表示初始时的猴子数量共有多少种可能性。

如果无解,即初始时有多少只猴子都不满足题目要求,则输出 0。

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

题目要求任意时刻猴子数量都在 [0,w]区间,所以我们假设初始猴子数量为 0,并统计所有时刻(包括初始时刻)中猴子数量的最大值和最小值,得到一个相对范围 [mincnt,maxcnt]。我们只需要将这个相对范围在规定范围 [0,w] 内“滑动”即可,总方案数为:
result=max(0,w−(maxcnt−mincnt)+1);

方案:c++

#include <bits/stdc++.h>
using namespace std;
using ll = long long; 

int main() {
    ll n, w;
    cin >> n >> w;
    // 由于初始时刻数量为 0,也应被统计到最值中
    // cur 记录当前时刻猴子的总数量
    ll maxcnt = 0, mincnt = 0, cur = 0;

    for(int i = 0; i < n; ++i) {
        // 读入当前时刻猴子变化量
        ll x;
        cin >> x;
        // 加入到结果中,并取最值
        cur += x;
        maxcnt = max(maxcnt, cur);
        mincnt = min(mincnt, cur);
    }
    printf("%lld\n", max((ll)0, w - (maxcnt - mincnt) + 1));
    return 0;
}

欢迎留言点赞

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值