1. 程式人生 > >火災逃生(一維版)(18.11.26)

火災逃生(一維版)(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。無論走廊裡有多少人,又會發生多少碰撞,其實每次碰撞都可以這麼理解,那麼其實最長的時間就是每一個人需要跑的距離的最大值。