第一行包含乙個整數表示螞蟻的個數n(2<=n<=99),之後共有n行,每一行描述乙隻螞蟻的初始狀態。每個初始狀態由兩個整數組成,中間用空格隔開,第乙個數字表示初始位置厘公尺數p(1<=p<=99),第二個數字表示初始方向,-1表示向左,1表示向右,0表示靜止。
輸出描述:
螞蟻a從開始到墜落的時間。若不會墜落,輸出「cannot fall!」
首先我們需要明確一點,性質一:a螞蟻經過偶數次碰頭後速度為0
\color\textbf
性質一:
a螞蟻經過偶數次碰頭後速度為
00次碰撞時,其速度本身就為0,2次碰撞是什麼情況呢?
經過兩次碰撞之後,a會再次裝上右側的速度為0的螞蟻,他的速度又回到0,永遠走不出去。
從上面圖中我們可以看到,我們只考慮了a的左側向右走的螞蟻,和a的右側向左走的螞蟻,那麼還有兩類左側向左走,右側向右走,他們對a有影響嗎?
性質二:左側向左,右側向右的螞蟻對結果無影響
\color\textbf
性質二:左側向左,右側向右的螞蟻對結果無影響
考慮下面左圖和右圖,左圖中a左側有乙個向左的螞蟻和乙個向右的螞蟻,二者相碰時則交換速度,此時對a而言,相當於右圖中我們只有乙個向右的螞蟻的場景,同理,右側向右的螞蟻對a也是沒有影響的。這也就是為什麼,我們可以將螞蟻看作可以互相穿過,而不是碰撞掉頭。
到這裡,我們已經找到了螞蟻不能墜落的條件,也知道了影響a的個體,因此我們可以使用兩個陣列l,r
l,rl,
r分別儲存a的左側向右的螞蟻和a的右側向左的螞蟻,然後再來討論他們是如何影響a的結果的(以下都假設l,r包含螞蟻的數目各不相等),我們不妨從最簡單的情況開始推導:
上面三種情況基本上包含了所有的不想等的情況,我們依次來討論一下
對於第一種情況,顯然a需要的時間是x
1x_1
x1。
對於第二種情況,x
2x_2
x2在x
1x_1
x1後面,而右側不會將a變向,所以答案仍然是x
1x_1
x1。
對於第三種情況,a先和x
0x_0
x0碰撞,再和x
1x_1
x1碰撞,此時他的速度為0,因為我們看作螞蟻可以互相穿過所以他最後總會和x
2x_2
x2碰撞,因此答案是x
2x_2
x2(還是畫圖吧)
我們發現右側有兩個,左側有乙個的時候,決定因素在於右側的第二個,因為左右側相同數目的螞蟻互相抵消,他們的碰撞使得a的速度最終為0,而打破僵局的那個螞蟻,就是第乙個左右側數目不對等的螞蟻。(左3右4那就是右面第四個,左3右1那就是左面第二個)
struct p a[max]
;bool
cmp(p p1, p p2)
intmain()
for(
int i =
0; i < n; i++
) ll l1 = vl.
size()
, l2 = vr.
size()
;sort
(vl.
begin()
, vl.
end(
), cmp)
;sort
(vr.
begin()
, vr.
end(
), cmp);if
(l1 == l2)
printf
("cannot fall!\n");
else
if(l1 > l2)
cout <<
100- vl[l1 - l2 -1]
.pos << endl;
//99還沒掉下去
else cout << vr[l1]
.pos << endl;
}}
墜落的螞蟻
一根長度為1公尺的木棒上有若干只螞蟻在爬動。它們的速度為每秒一厘公尺或靜止不動,方向只有兩種,向左或者向右。如果兩隻螞蟻碰頭,則它們立即交換速度並繼續爬動。三隻螞蟻碰頭,則兩邊的螞蟻交換速度,中間的螞蟻仍然靜止。如果它們爬到了木棒的邊緣 0或100厘公尺處 則會從木棒上墜落下去。在某一時刻螞蟻的位置...
牛客 墜落的螞蟻
一根長度為1公尺的木棒上有若干只螞蟻在爬動。它們的速度為每秒一厘公尺或靜止不動,方向只有兩種,向左或者向右。如果兩隻螞蟻碰頭,則它們立即交換速度並繼續爬動。三隻螞蟻碰頭,則兩邊的螞蟻交換速度,中間的螞蟻仍然靜止。如果它們爬到了木棒的邊緣 0或100厘公尺處 則會從木棒上墜落下去。在某一時刻螞蟻的位置...
poj 1003 墜落的螞蟻
描述 一根長度為1公尺的木棒上有若干只螞蟻在爬動。它們的速度為每秒一厘公尺或靜止不動,方向只有兩種,向左或者向右。如果兩隻螞蟻碰頭,則它們立即交換速度並繼續爬動。三隻螞蟻碰頭,則兩邊的螞蟻交換速度,中間的螞蟻仍然靜止。如果它們爬到了木棒的邊緣 0或100厘公尺處 則會從木棒上墜落下去。在某一時刻螞蟻...