墜落的螞蟻 思維 模擬

2021-10-05 10:01:55 字數 2234 閱讀 6030

第一行包含乙個整數表示螞蟻的個數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厘公尺處 則會從木棒上墜落下去。在某一時刻螞蟻...