codeforce 589 D. Boulevard

原创 2015年11月18日 17:01:18

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


版权声明:本文为博主原创文章,欢迎大家转载,我们都是相互学习,共同进步。

相关文章推荐

CodeForces #589 D Boulevard 模拟

题目描述:Description Welcoming autumn evening is the best for walking along the boulevard and n people ...

CodeForces 589D --- D. Boulevard (数学题目--枚举分类讨论)

D. Boulevardtime limit per test 2 seconds memory limit per test 512 megabytes input standard in...

DFS J. Cleaner Robot Codeforce 589J(实例与分析)

J. Cleaner Robot time limit per test 2 seconds memory limit per test 512 megabytes ...

CodeForces 589D

题目大意是给定一些有限制的区间,求每个区间和其他区间相交的次数,依次输出区间相交的个数   思路:     暴力,数学   借鉴了大神的代码   对于任意一个起点 都可以有 x = t + b...

codeforce761D

codeforce 761D 看到codeforce 的d题居然会有这样的水题我增加了一点信心(下次cf一定要再拼拼看,现在自己可以在cf上去拼的有算法的题就是dp、二分、搜索、贪心这些的) 思路...

codeforce 359D 二分+ 动态规划(sparse table)

原题链接:http://codeforces.com/problemset/problem/359/D 思路:首先对符合题目的长度(r-l)从0到n-1进行二分查找,对每一个长度进行check,看是...

codeforce 776 D The Door Problem(DFS遍历)

D. The Door Problem time limit per test 2 seconds memory limit per test 256 megabytes ...

Codeforce 798D(贪心)

链接:点击打开链接 题意:给出两个长度为n的数组A,B,要求从A,B中取出至多n/2+1个下标相同的元素,使得取出的A的和大于二倍A数组的总和,取出的B大于二倍B数组的总和 代码:#include...

codeforce 583D Once Again... - 最长上升子序列

/** codeforce 583D Once Again... 给定一个数列包含n个数,将它复制t次,得到一个新的数列, 求这个数列的最长非递减子序列。 看到题目条件n比较小t比较大,而子序列又要...

codeforce 237 C D

c题其实一般般吧,关于l什么的题意理解了好一会儿。暴力会超时,当然,优化很简单。 用了个q数组,q[i]代表i之前的素数的个数 还有s数组,s[i]代表第i个素数 之后就看着办吧 #inclu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforce 589 D. Boulevard
举报原因:
原因补充:

(最多只允许输入30个字)