暴力搜索,对于第 i 个人,判断所有第 j ( j=i+1,……,n) 个人是否能与其相遇,如果能相遇,则第 i 和第 j 个人的相遇人数都要加 1 .
首先要对 第 i 和第 j 个人的起始位置进行判断,如果谁进入道路的时间早,就走到 晚进入道路的那个人 进入道路的时间点;
此时再对这两个人剩余的路途进行判断,如果两个人中谁的剩余的路途为负数了,说明在另一个人还没上路之前这个人就已经到达终点了,则两个人必然不能相遇,继续判断下一个人
如果此时两人的起始位置相同,说明两个人一上路就碰到了,此时两个人的人数都要加 1
除了起始位置相同外,两个人想要相遇只有一种可能,那就是相向而行,而且两人剩余的路途必然要大于等于两个人之间距离的一半,如果谁的剩余的路途小于一半,说明这个人先走完了,而另一个还在走
代码如下:
#include <iostream>
#include <vector>
using namespace std;
struct node
{
int t;
int s;
int f;
int d; //保存方向
};
int main()
{
int n,i,j,pos1,pos2;
double t,t1,t2;
cin>>n;
vector<int> re(n); //存放结果
vector<node> vec(n);
for(i=0;i<n;++i)
{
cin>>vec[i].t>>vec[i].s>>vec[i].f;
vec[i].d=(vec[i].s<vec[i].f?1:-1);// 目的地大于其实地,向右走方向为 1,否则为 -1
}
for(i=0;i<n;++i)
{
for(j=i+1;j<n;++j)
{
pos1 = vec[i].s;
pos2 = vec[j].s;
if(vec[i].t<vec[j].t) //如果第 j 个人后上路,则第 i 个人走到 j 上路的时间
pos1 = (vec[j].t-vec[i].t)*vec[i].d+vec[i].s;
else if(vec[i].t>vec[j].t) //如果第 i 个人后上路,则第 j 个人走到 i 上路的时间
pos2 = (vec[i].t-vec[j].t)*vec[j].d+vec[j].s;
t1 = vec[i].f-pos1; // 第 i 个人还剩下多少路程
t1 *= vec[i].d;
t2 = vec[j].f-pos2; // 第 j 个人还剩下多少路程
t2 *= vec[j].d;
if(t2<0||t1<0) //任何人剩余路程为负数,说明此人在另一个人还没上路前就已经走完
continue;
if(pos1==pos2) // 起始位置相等,必然相遇
re[i]+=1,re[j]+=1;
else if((pos1<pos2&&vec[i].d==1&&vec[j].d==-1)||(pos1>pos2&&vec[i].d==-1&&vec[j].d==1))
{ // 相向而行的条件,要么 i 在 j 的左边且 i 向右走 j 向左走;要么 j 在 i 的左边且 j向右走 i 向左走
t = abs(pos2-pos1); //两个人之间总的剩余路程
t /= 2;
if(t1>=t&&t2>=t) // 必须每人至少走一半
re[i]+=1,re[j]+=1;
}
}
}
for(i=0;i<n;++i)
cout<<re[i]<<" ";
return 0;
}