题解 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;//快乐结束
}
posted @ 2020-04-29 13:09  Ciciiiii  阅读(144)  评论(0)    收藏  举报