一棵大树上初始时有若干个猴子(也可能没有)。
接下来 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;
}
欢迎留言点赞