题解 CF1304C 【Air Conditioner】
Solution:
维护在第i个顾客来时,餐厅温度能调到的最高温和最低温
再将它并上使顾客满意的最高温和最低温
如果没有交集,则跳出
但是需要注意,只能输出一次,所以要记一个F表示是否输出过
记得读完数据
为了保险,我都开了longlong
代码很简短,有解释
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline long long read(){
long long f=1,res=0;char c=getchar();
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){res=res*10+c-'0',c=getchar();}
return f*res;
}//快读
long long q,n,m;
long long l[101],t[101],h[101];
//t[i]表示第i个客人什么时候来
//l[i]、h[i]分别表示第i个客人满意的最低温和最高温
long long dp[101][2];
//dp[i][0]表示第i个客人来时能调到的最低温,dp[i][1]表示能调到的最高温
bool f=1;
int main(){
q=read();
while(q--){
f=1;
n=read();m=read();
memset(dp,0,sizeof(dp));
dp[0][0]=dp[0][1]=m;//记得初始化,第0个客人来时温度为m
for(int i=1;i<=n;i++){
t[i]=read();l[i]=read();h[i]=read();
dp[i][0]=max(dp[i-1][0]-(t[i]-t[i-1]),l[i]);
dp[i][1]=min(dp[i-1][1]+(t[i]-t[i-1]),h[i]);//转移方程,必须让第i-1和第i个客人都满意才行
if(dp[i][0]>dp[i][1]&&f){//没有交集
cout<<"NO"<<endl;f=0;
}
}
if(f) cout<<"YES"<<endl;//输出
}
return 0;//快乐结束
}