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

火灾逃生(一维版)

Description

某天晚上,软院某条狭窄的走廊突然发生了火灾,该走廊只有首尾两个出口,且因为过于狭窄,两个人不能并排。假设t=0的时候发生了火灾,此时有N个人在长度为L的走廊里,走廊的最左端的坐标是(0,0),最右端的坐标是(L,0), 第i个人的位置是(D​i,0)。面朝左边或者右边,用0和1分别表示面朝左边和右边。假设从火灾发生的时刻开始,每个人都朝着t=0时面朝的方向以1的速度前进。当两个人相遇的时候两个人会立马掉头回跑。为了所有人的安全,请计算出所有人离开走廊时的时刻。初始状态下不会有两个人在同一个位置。

Input

第一行有一个整数 T T &lt; 10 T(T&lt;10) 表示有T个案例,每个案例的第一行有两个整数N(0<N<10^5)和L(0<L<10^5),意义如上所述,接下来是N行,第i行有两个数Di(0<Di<L),表示第iii个人的位置是(Di,0)和z(0或1,0表示面朝向左,1表示面朝向右)。

Output

请输出所有人都离开走廊的时刻。

Sample Input 1

1
2 10
5 1
8 0

Sample Output 1

8

Hint

注,掉头的时间忽略不计。

这一题一开始其实是看错题了。以为两个人如果碰到了会穿过去。以为只要计算知道了位置与跑的方向就知道了最大时间。后来发现走廊只有一人宽,碰到后需要掉头,然后就不知道怎么想了,就卡在这了。后来抱着试一试的思想写了一下一开始那种思路的代码,ac了…什么鬼题??!

贴一下代码:

#include<stdio.h>
int main()
{
    int T,N,L,a,b,x,s;
    while(scanf("%d",&T)!=EOF)
    {
        s=0;  //用来储存每个人跑到面向一头的距离的最大值
        scanf("%d %d",&N,&L);
        while(N--)
        {
            scanf("%d %d",&a,&b);
            if(b==0)
                x=a;  //如果是向左跑的距离就是当前位置
            else if(b==1)
                x=L-a;  //如果向右跑的距离就是L-当前位置
            if(x>s)
                s=x;
        }
        printf("%d\n",s);
    }
    return 0;
}

后来自己想了一下,不知道是不是应该这么想,因为是确定代码对的情况下才想出来的思路。

写一下我的理解:即使两个人是面对着跑的,碰上以后会掉头,在这里我们可以理解为其实就是碰到后直接就穿过去了,也可以理解为碰到后两人交换了位置,

例如给出的测试样例,

A 位置:5,向右
B 位置:8,向左

两个人跑起来以后会在6.5那个位置发生碰头,然后掉头继续跑。
我们就可以理解成其实在6.5那个位置,A与B发生了互换,B到了A的左边,跑完剩下的6.5,A到了B的右边,跑完剩下的3.5。无论走廊里有多少人,又会发生多少碰撞,其实每次碰撞都可以这么理解,那么其实最长的时间就是每一个人需要跑的距离的最大值。

猜你喜欢

转载自blog.csdn.net/qq_42882715/article/details/84554811
今日推荐