Codeforces Round #620 (Div. 2)
[codeforces 1304C] Air Conditioner 冗余的代码,意味着消耗+难点:必须所有数据读完,再处理
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.ml/contest/1304/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Air Conditioner | GNU C++11 | Accepted | 46 ms | 0 KB |
冗余的代码,意味着消耗+难点:必须所有数据读完,再处理
算法如下,对温度的区间进行处理,看可能值与现实值是否有矛盾,在处理过程中,取交集。
3 0
5 1 2 可能区间0 5;取交集1 2 可能区间计算0 0+5可得0 5
7 3 5 可能区间1 4;取交集3 4 可能区间计算1 2+(7-5)可得1 4
10 -1 0 可能区间0 4;取交集0 0 可能区间计算3-(10-7) 4可得0 4
YES
2 12
5 7 10 可能区间7 12;取交集7 10
10 16 20 可能区间7 15;取交集 空集
NO
3 -100
100 0 0 可能区间0 0;取交集0 0
100 -50 50 可能区间0 0;取交集0 0
200 100 100 可能区间100 100;取交集100 100
YES
1 100
99 -100 0 可能区间1 100;取交集 空集
NO
无冗余的AC代码
#include <stdio.h>
struct node{
int t,l,r;
}a[105];
int min(int a,int b){
return a<b?a:b;
}
int max(int a,int b){
return a>b?a:b;
}
int main(){
int q,n,m,t,i,flag;
scanf("%d",&q);
while(q--){
scanf("%d%d",&n,&m);
a[0].t=0,a[0].l=m,a[0].r=m,flag=0;
for(i=1;i<=n;i++)scanf("%d%d%d",&a[i].t,&a[i].l,&a[i].r);//难点:必须所有数据读完,再处理
for(i=1;i<=n;i++){
t=a[i].t-a[i-1].t;
if(a[i-1].r<a[i].l){
if(a[i-1].r+t<a[i].l){
flag=1;
break;
}else{//a[i-1].r+t>=a[i].l
a[i].l=a[i].l;
a[i].r=min(a[i].r,a[i-1].r+t);
}
}else if(a[i].r<a[i-1].l){
if(a[i].r<a[i-1].l-t){
flag=1;
break;
}else{//a[i].r>=a[i-1].l-t
a[i].r=a[i].r;
a[i].l=max(a[i].l,a[i-1].l-t);
}
}else{//i-1与i对应的温度区间有重叠
a[i].l=max(a[i].l,a[i-1].l-t);
a[i].r=min(a[i].r,a[i-1].r+t);
}
}
if(flag)printf("NO\n");
else printf("YES\n");
}
return 0;
}
冗余的AC代码(比赛时的提交代码),如下
#include <stdio.h>
struct node{
int t,l,r;
}a[110],b[110];
int min(int a,int b){
return a<b?a:b;
}
int max(int a,int b){
return a>b?a:b;
}
int main(){
int q,n,m,i,j,t,l,r,flag;
scanf("%d",&q);
while(q--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d%d%d",&a[i].t,&a[i].l,&a[i].r);
t=a[1].t;
if(m<a[1].l){
if(m+t<a[1].l){
printf("NO\n");
continue;
}else{//m+t>=a[1].l;
a[1].l=a[1].l;
a[1].r=min(a[1].r,m+t);
}
}
else if(a[1].l<=m&&m<=a[1].r){
a[1].l=max(m-t,a[1].l);
a[1].r=min(m+t,a[1].r);
}
else if(a[1].r<m){
if(a[1].r<m-t){
printf("NO\n");
continue;
}else{//a[1].r>=m-t
a[1].r=a[1].r;
a[1].l=max(a[1].l,m-t);
}
}
flag=0;
for(i=2;i<=n;i++){
t=a[i].t-a[i-1].t;
l=a[i-1].l-t,r=a[i-1].r+t;
if(r<a[i].l||a[i].r<l){
flag=1;
break;
}else{
a[i].l=max(a[i].l,l);
a[i].r=min(a[i].r,r);
}
}
if(flag){
printf("NO\n");
}else printf("YES\n");
}
return 0;
}