蓝桥3898.泡澡
题目
问题描述
在一个寒冷的冬天,有
输入格式
第一行包含两个整数
接下来
输出格式
如果可以按照所有人的计划供应热水,则输出
样例输入
2 5
1 3 3
2 3 3
样例输出
No
样例说明
在时间段
题解
首先,因为S, T, P
都是在一个区间范围内统一加一个数,让人联想到差分数组。
构建一个差分数组,由于初始时,所有时刻用水量均为0:(1)用水量为0 --> diff[1]=0(下标从1开始);(2)所有时刻都为0 --> diff[i]=0
根据输入的S, T, P
,可以对差分数组在区间两端的数字进行增减。具体来说,如果我们想在区间 [s, t)
内每个元素加上 p
,我们只需要执行以下操作:
diff[s] += p
diff[t] -= p
由于差分数组的下标通常是从 1 开始,假设时间是从 0 开始的,区间[s, t)
表示从时间s
到时间t-1
。为了在差分数组中正确表示这个区间,我们需要将s
和t
都加 1。这样,diff[s+1] += p
表示在时间s
开始加上p
,而diff[t+1] -= p
表示在时间t
结束时减去p
。
值得注意的是,在所有人的洗澡需求输入之前,我们并不知道最大的时间区间是多少,因此为了避免麻烦,在一开始便开一个较大的列表来存储差分数组,其中要考虑到0不取,最大时间+1的这个范围。
最后的最后,将差分数组作前缀和,便可以得到“原数组”,即每个时间段的用水量统计,判断最大用水量是否在规定范围内即可。
python
TIME=200000
n,w=map(int,input().split())
diff=[0]*(TIME+2) #包括了0和TIME+1
tm=0 #最晚时间
for _ in range(n):
s,t,p=map(int,input().split())
diff[s+1]+=p
diff[t+1]-=p
tm=max(t,tm)
res=[0]*(tm+1)
for i in range(1,tm+1):
res[i]=res[i-1]+diff[i]
if max(res)>w:
print('No')
else:
print('Yes')