火灾逃生(一维版)(2018.11.26)

描述:
某天晚上,软院某条狭窄的走廊突然发生了火灾,该走廊只有首尾两个出口,且因为过于狭窄,两个人不能并排。

假设t=0的时候发生了火灾,此时有NN个人在长度为LL的走廊里,走廊的最左端的坐标是(0,0),最右端的坐标是(L,0), 第i个人的位置是(D_i,0)。面朝左边或者右边,用0和1分别表示面朝左边和右边。假设从火灾发生的时刻开始,每个人都朝着t=0时面朝的方向以1的速度前进。当两个人相遇的时候两个人会立马掉头回跑。为了所有人的安全,请计算出所有人离开走廊时的时刻。初始状态下不会有两个人在同一个位置。
输入:
第一行有一个整数 T T &lt; 10 T(T&lt;10) 表示有T个案例,每个案例的第一行有两个整数N(0<N<105)和L(0<L<105,意义如上所述,接下来是N行,第i行有两个数D_i(0<Di<L0<Di<L),表示第i个人的位置是(Di,0)和z(0或1,0表示面朝向左,1表示面朝向右)。
输出:
请输出所有人都离开走廊的时刻。
样例输入:

1
2 10
5 1
8 0

样例输出:

8

注,掉头的时间忽略不计。
分析:
其实这道题可以用四个字来总结:相遇变身
因为这里面的人都是一样的不具有特殊性,所以在他们相遇的时候可以视为保持原样错做而继续前进,这样便可以认为每个人都是独立运动的,所以求最长时间,就是人到走廊尽头的最长长度(注意方向)。
对每个人只检查一次,时间复杂度为O(n),限制条件为10^5,满足条件
代码如下:

#include<stdio.h>
#define max(a,b) (a>b?a:b)
int main()
{
	int t,n,l,a,b,tp;
	scanf("%d",&t);
	while(scanf("%d%d",&n,&l)!=EOF)
	{
	    int maxn=0;
		for(int i=0;i<n;++i)
		{

			scanf("%d %d",&a,&b);
			tp=max(a,l-a);
			maxn=max(maxn,tp);
		}
		printf("%d\n",maxn);
	}
	return 0;
}`

猜你喜欢

转载自blog.csdn.net/weixin_43262763/article/details/84563910