火災逃生(一維版)(18.11.26)
火災逃生(一維版)
Description
某天晚上,軟院某條狹窄的走廊突然發生了火災,該走廊只有首尾兩個出口,且因為過於狹窄,兩個人不能並排。假設t=0的時候發生了火災,此時有N個人在長度為L的走廊裡,走廊的最左端的座標是(0,0),最右端的座標是(L,0), 第i個人的位置是(Di,0)。面朝左邊或者右邊,用0和1分別表示面朝左邊和右邊。假設從火災發生的時刻開始,每個人都朝著t=0時面朝的方向以1的速度前進。當兩個人相遇的時候兩個人會立馬掉頭回跑。為了所有人的安全,請計算出所有人離開走廊時的時刻。初始狀態下不會有兩個人在同一個位置。
Input
第一行有一個整數 表示有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。無論走廊裡有多少人,又會發生多少碰撞,其實每次碰撞都可以這麼理解,那麼其實最長的時間就是每一個人需要跑的距離的最大值。