Air Conditioner

题目:

题意解析:

  • 一个餐馆中有个空调,每分钟可以选择上调 1 个单位的温度或下调  1 个单位的温度,当然你也可以选择不变,初始的温度为 m 。

  • 有 n 个食客,每个食客会在 ti​ 时间点到达,他所能适应的最低温度是 li​ ,最高温度是 hi​ ,他只会在 ti​ 时刻逗留。

  • 如果温度不在食客的适应范围内,他就会不舒服,请你判断,空调能否使得 n 位来就餐的食客都感到舒服。

  • 本题多组数据,数据组数不大于 500500。

  • 1≤n≤100,−10^9≤m,li​,hi​≤10^9,1≤ti​≤109。

题意解析:

(1)因为输入的时间是从小到大输入,所以不用排序处理。用 t 记录上次的时间,left记录上次最小的值,right记录的是上次最大的值。

(2)缩小范围是用上次的值,先使用 left-(a-t),right+(a-t)。(a-t是时间差值。)求出本次时间范围的最大值。然后判断输入的值在不在时间范围中,最后判断要不要缩短时间范围。

(3)判断输入的值在不在时间范围中,只有的两种情况,就是输入的最大值比left小,或者是输入的最小值比right大。

(4)缩短时间范围,也有两种情况,一种是b比left大,left=b,一种是right比c小,right=c。这两种是分开考虑的。你可以在纸上画图处理,最后得到这两种是最简单的处理方法。

代码:

#include<bits/stdc++.h>
using namespace std;
int q,n;
long long int m;
int main() {
	cin>>q;
	while(q--) {
		cin>>n>>m;
		long long int left,right,t;
		int sign=0;
		left=right=m;
		t=0;
		for(int i=0; i<n; i++) {
			long long int a,b,c;
			cin>>a>>b>>c;
			if(sign==0) {
				left=left-(a-t);
				right=right+(a-t);
				// 判断一下是不是在范围内
				if(b>right||c<left) {
					sign=1;
					continue;
				}
				if(left<b){
					left=b;
				}
				if(right>c){
					right=c;
				}
				t=a;
			}
		}
		if(sign==0) {
			cout<<"YES"<<endl;
		} else {
			cout<<"NO"<<endl;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值