题意:
有一家烤肉餐厅,每天会迎接很多顾客。
每个顾客,他们都有自己能接受的温度范围。如果他们进入餐厅时温度在他们的接受范围内,他们就会感到高兴。
餐厅的空调有三种状态:关闭,加热,冷却。加热时温度每分钟升高一度。冷却时温度每分钟下降一度。
现在给出所有会来的顾客的到达时间,所能接受的最低温度和最高温度,询问老板是否可以让所有顾客开心。
题解:
开一个结构体存储每个顾客的信息。
先对所有顾客排序,优先级按照时间升序、能接受的最低温度升序、能接受的最高温度升序。
然后遍历整个结构体数组,模拟调温度这个过程,每次存储温度所能调的范围,贪心思想。
#include<bits/stdc++.h> using namespace std; int N,M; struct node { int t; int l; int r; }; vector<node> vi; bool cmp (node a,node b) { if (a.t!=b.t) return a.t<b.t; else if (a.l!=b.l) return a.l<b.l; else return a.r<b.r; } void solve () { vi.clear(); scanf("%d%d",&N,&M); int L=M; int R=M; for (int i=0;i<N;i++) { int t,l,r; scanf("%d%d%d",&t,&l,&r); vi.push_back({t,l,r}); } sort(vi.begin(),vi.end(),cmp); for (int i=0;i<N;i++) { int t=vi[i].t; if (i) t-=vi[i-1].t; L=max(L-t,vi[i].l); R=min(R+t,vi[i].r); if (L>R) { printf("NO\n"); return; } } printf("YES\n"); } int main () { int T; scanf("%d",&T); while (T--) solve(); return 0; }