题意:所有人都在一条街上,抽象成坐标轴,有三组输入数据ti,si,fi,表示第i个人在ti秒出现在街上,从si往fi走,单位时间位移为1当两个人走到一个位置时,都互相打招呼,如果两个人相遇多次,只打一次招呼,到了目的地之后就不能打招呼了
分析:开始没头绪,后来队友说,可以抽象成线段的交点个数问题,每个人的行走过程可以描述成一个二维坐标轴上的线段,这样记录斜率和开始结束的时间就可以搞定了,
然后分两类,一类是斜率不同,一种是斜率相同,斜率不同只要比较开始结束时间就行了,斜率相同有两种情况(在一条直线上和平行),平行不用管,只要考虑在一条直线上就行了(很简单,自己在纸上分析一下)
详情见代码
1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 #include<vector> 9 #include<deque> 10 #include<stack> 11 using namespace std; 12 const int maxn=0x3f3f3f; 13 14 struct point{ 15 int t,s,f,k; 16 int L,R; 17 void cal(){ 18 if(s<f)k=1; 19 else k=-1; 20 L=t; 21 R=t+abs(f-s); 22 if(L>R){ 23 int tem=L; 24 L=R; 25 R=tem; 26 } 27 } 28 }p[1005]; 29 30 bool vis[1005][1005]; 31 int ans[1005]; 32 33 int main(){ 34 int n; 35 while(cin>>n){ 36 for(int i=0;i<n;i++){ 37 cin>>p[i].t>>p[i].s>>p[i].f; 38 p[i].cal(); 39 } 40 memset(ans,0,sizeof(ans)); 41 memset(vis,false,sizeof(vis)); 42 for(int i=0;i<n;i++) 43 for(int j=i+1;j<n;j++){ 44 if(i==j) 45 continue; 46 if(p[i].k!=p[j].k){ 47 double x=p[j].s-p[i].s+p[i].k*p[i].t-p[j].k*p[j].t; 48 x/=p[i].k-p[j].k; 49 if(!vis[i][j]&&!vis[j][i]&&x>=p[i].L&&x<=p[i].R&&x>=p[j].L&&x<=p[j].R){ 50 ans[i]++;ans[j]++; 51 vis[i][j]=vis[j][i]=1; 52 } 53 } 54 else if((p[j].s-p[i].s+p[i].k*(p[i].t-p[j].t))==0){ 55 if(p[i].L<=p[j].L&&p[j].L<=p[i].R||p[j].L<=p[i].L&&p[i].L<=p[j].R){ 56 ans[i]++;ans[j]++;vis[i][j]=vis[j][i]=1; 57 } 58 } 59 60 } 61 cout<<ans[0]; 62 for(int i=1;i<n;i++) 63 cout<<" "<<ans[i]; 64 cout<<endl; 65 } 66 return 0; 67 }
时间: 2024-10-03 13:20:21