codeforce 589 D. Boulevard

暴力搜索,对于第 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值