学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:蓝桥杯备考冲刺必刷题(C++) | 汇总-CSDN博客
【题目描述】
在一个寒冷的冬天,有
N
N
N个人想要去澡堂泡澡,第
i
i
i个人会在时间段
[
S
i
,
T
i
)
[S_i,T_i)
[Si,Ti)(不包括
T
i
T_i
Ti)内每分钟使用
P
i
P_i
Pi升热水。由于该澡堂设备简陋,无法存储热水。热水器在每分钟最多能提供
W
W
W升热水。现在请问该澡堂能否满足这
N
N
N个人的泡澡需求, 如果可以请输出
Y
e
s
Yes
Yes,否则输出
N
o
No
No。
【输入】
第一行包含两个整数
N
N
N和
W
W
W,表示洗澡的人数和热水器的容量。
接下来
N
N
N行,每行包含三个整数
S
i
,
T
i
S_i,T_i
Si,Ti和
P
i
(
0
≤
S
i
<
T
i
≤
2
×
1
0
5
,
1
≤
W
,
P
i
≤
1
0
9
)
P_i(0\le S_i\lt T_i\le 2\times 10^5,1\le W,P_i\le 10^9)
Pi(0≤Si<Ti≤2×105,1≤W,Pi≤109),表示第
i
i
i个人的洗澡计划。其中
S
i
S_i
Si和
T
i
T_i
Ti表示计划的开始时间和结束时间,
P
i
P_i
Pi表示每分钟需要的热水量。
【输出】
如果可以按照所有人的计划供应热水, 则输出
Y
e
s
Yes
Yes,否则输出
N
o
No
No。
【输入样例】
2 5
1 3 3
2 3 3
【输出样例】
No
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, w, a[200005];
signed main()
{
cin >> n >> w;
for (int i=1; i<=n; i++) { // 记录n个人的使用热水需求
int s, t, p;
cin >> s >> t >> p;
a[s]+=p; // 更新差分数组
a[t]-=p;
}
for (int i=0; i<200005; i++) { // 按照时间轴进行遍历
if (i>0) { // 最后一个测试点T为0,a[0]>w,所以这里只有i大于0的时候才做差分数组的前缀和
a[i] = a[i]+a[i-1];
}
if (a[i]>w) { // 每次还原a[i]后判断是否超过热水器能提供的w升热水
cout << "No" << endl; // 如果超过即输出No
return 0;
}
}
cout << "Yes" << endl; // 都不超的话输出Yes
return 0;
}
【运行结果】
2 5
1 3 3
2 3 3
No