codeforce 589 D. Boulevard

来源:互联网 发布:网站美工 招聘 长沙 编辑:程序博客网 时间:2024/05/16 04:59

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