藍橋杯 感冒螞蟻

2021-09-05 07:57:22 字數 1473 閱讀 1520

藍橋杯歷屆試題 

螞蟻感冒

問題描述

長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。

每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺/秒。

當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。

這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。

請你計算,當所有螞蟻都爬離桿子時,有多少只螞蟻患上了感冒。

輸入格式

第一行輸入乙個整數n (1 < n < 50), 表示螞蟻的總數。

接著的一行是n個用空格分開的整數 xi (-100 < xi < 100), xi的絕對值,表示螞蟻離開桿子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,資料中不會出現0值,也不會出現兩隻螞蟻占用同一位置。其中,第乙個資料代表的螞蟻感冒了。

輸出格式

要求輸出1個整數,表示最後感冒螞蟻的數目。

樣例輸入

35 -2 8

樣例輸出

1樣例輸入

5-10 8 -20 12 25

樣例輸出

3

剛接觸題目時有點沒有思路,因為會想的太多,在思考每乙個螞蟻的行動狀態甚至每個時候的螞蟻狀態是一件勞而無功的事情,以至於走了彎路。知道檢視了題解,才意識到了解題的要路。

要清楚的幾點是:

1,每個螞蟻的速度是相同的,乙個螞蟻如果和感冒螞蟻在同一方向上前進,除了螞蟻回頭,是不會相遇的。

2,螞蟻的轉頭可以看做是兩個螞蟻乙個向左乙個向右,碰見後反轉,乙個向右乙個向左,而題目所求的是感冒的螞蟻數目,所以感染的螞蟻個體對結果並不會產生影響。

3,在感冒的螞蟻傳染給正常螞蟻並反轉後,正常螞蟻代替原螞蟻繼續向原來的方向傳染,在相反的方向,也開始傳染感冒。

總結:如果原來的螞蟻行動方向是向左,

那麼該螞蟻左方的向右行動的螞蟻會被傳染。

該螞蟻右方的向左行動的螞蟻:

如果原來的螞蟻向後反轉,那麼將會被傳染。(這時左方有向右行動的螞蟻已經被傳染)

如果左方沒有向右行動的螞蟻,那麼該螞蟻不會反轉,不會被傳染。

其餘方向行走的螞蟻則不會被傳染。

如果原始方向是向右,同理推斷。

解題**為:

#include#includeusing namespace std; 

#define max 50

int ant[max];

int main()

int h=abs(ant[0]);

for ( i=1;i0&&abs(ant[i])h) //方向向左,即向左行走&&距離左端大於原螞蟻,即在其右側

right++;

} if ((left==0&&ant[0]>0)||(right==0&&ant[0]<0)) //向左行走時左側沒有向右行走的||向右行走時右側沒有向左行走的

cout<<1

}

藍橋杯 螞蟻感冒

時間限制 1 sec 記憶體限制 128 mb 長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺 秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。請你...

藍橋杯 螞蟻感冒

問題描述 長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺 秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。請你計算,當所有螞蟻都爬離桿子時,有多少只...

藍橋杯 螞蟻感冒

長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺 秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。請你計算,當所有螞蟻都爬離桿子時,有多少只螞蟻患上了...