Gildong的餐厅每单位时间最多上下调整\(1\)单位温度。
对于某些时刻,总共给出\(n\)个区间,问是否可以使得每一时刻的温度保持在这些区间里面。
\((1≤??≤100)\)
有点像“接元宝”那一类的题。不过这题只需要判断是否可以,而不需要找到最多能保证多少个。那么问题就很简单了。
抛开限制区间思考,从初始温度\(m\)开始,经过\(1\)单位时间,其实就相当于可以存在的温度变成一个区间\([m-1,m+1]\)。以此类推我们可以求出来,无“限制区间”情况下,任意时刻的可调节温度区间。
讨论限制区间时,首先,如果能保持温度在限制区间里面,那么同一时刻的多个区间必须有一个公共区间或者公共点。所以我们只需要对这个公共区间/点进行讨论即可。所以我们可以认定,同一时刻只有一个限制区间。
限制区间本身已经排好序,所以我们只需要按照时间顺序,合并同一时刻区间,然后按顺序判断是否任一时刻可调节温度区间与限制区间是否有重叠区间即可,同时也合并区间。
#include <bits/stdc++.h>
using namespace std;
int n,m,tl,tr;
int ti[105],l[105],r[105];
void solve(){
scanf("%d %d", &n, &m);
for(int i=1;i<=n;i++)
scanf("%d %d %d", &ti[i], &l[i], &r[i]);
tl=tr=m;
ti[0]=0;
for(int i=1,j=1;i<=n;i=j){
tl-=ti[i]-ti[i-1], tr+=ti[i]-ti[i-1];
tl=max(tl,l[i]), tr=min(tr,r[i]);
for(j=i+1;j<=n && ti[j]==ti[j-1];j++){
tl=max(tl,l[j]);
tr=min(tr,r[j]);
}
if(tl>tr){
printf("NO\n");
return;
}
}
printf("YES\n");
}
int main(){
int T=1;
scanf("%d", &T);
while(T--){
solve();
}
return 0;
}
原文:https://www.cnblogs.com/leachim/p/12359825.html