[codeforces 1304C] Air Conditioner 冗余的代码,意味着消耗+难点:必须所有数据读完,再处理

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;
}
扫描二维码关注公众号,回复: 9345695 查看本文章
发布了537 篇原创文章 · 获赞 529 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104339525