2020.7.27T2走路(jz暑假训练day11)

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

3
3 2 4
4 3 4
3 6 4

Sample Output

2 2 2

Data Constraint

在这里插入图片描述

Hint

一个人在t[i]之前不存在, 在走到f[i]之后消失.

这个题n方做法就行了,然后说一下自己的做法,当我们要判断i与j是否能打招呼时,先让时间短的补到时间长的,这时将现在到达的位置计算一下,若超出了目的地,显然不合法。之后若没超出,判断是否等于另一个的起始点,等于就合法。最后若不在一个点上,那么同一个方向的肯定遇不到,所以我们再判断不是同一个方向的时候,看一下到达的位置是否在两个点的范围内就行了。

#include<cstdio>
#include<algorithm>
#define N 1007
using namespace std;
int n,t[N],s[N],f[N],bz[N];
int main(){
	freopen("walk.in","r",stdin);
	freopen("walk.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&t[i],&s[i],&f[i]);
		bz[i]=(s[i]<f[i])?1:-1;
	}
	for(int i=1;i<=n;i++){
		int ans=0;
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			int t1=t[i],s1=s[i],f1=f[i],b1=bz[i];
			int t2=t[j],s2=s[j],f2=f[j],b2=bz[j];
			if(t1>t2) swap(t1,t2),swap(s1,s2),swap(f1,f2),swap(b1,b2);
			//将时间少的放到t1方便处理
			s1+=b1*(t2-t1);//将时间补上
			if(s1>f1&&b1==1) continue;
			if(s1<f1&&b1==-1) continue;//若补上时间后的点超过了范围就不行
			if(s1==s2){//此刻位置一样,合法
				ans++;
				continue;
			}
			if(b1!=b2){//方向不一样时
				if(s1<s2&&b1==-1&&b2==1||s1>s2&&b1==1&&b2==-1) continue;//如果背对着就不合法
				else{
					double s=(s1+s2)/2.0;//s为相遇的点
					if(s1<s2){
						if(s<=f1&&s>=f2){ans++;continue;}
					}else if(s>=f1&&s<=f2){ans++;continue;}//如果双方都能走到s就合法
				}
			}
		}
		printf("%d ",ans);
	}
}

猜你喜欢

转载自blog.csdn.net/jay_zai/article/details/107618665
今日推荐