藍橋杯 試題 歷屆試題 螞蟻感冒

2022-06-25 02:42:12 字數 2131 閱讀 7864

問題描述

長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這一題與 poj no.1852(ant)思路相似,首先來看一下poj的題目:

題目描述:

因為題目難抄,所以直接用了這位朋友的,我也是在一起來挑戰程式設計這本書中看到這一題的。

如果暴力搜尋所有螞蟻向左或向右兩種可能,則有2^n複雜度,指數**。

接下來思考最長時間。

如果直接考慮乙個螞蟻不間斷的相遇,改變自己的方向...會讓問題變得很複雜。實際上,我們考慮的是最長時間,而不是某個螞蟻的狀態。

如果忽略了螞蟻之間的區別,可以認為兩個螞蟻相遇時是保持原方向交錯而過。

這樣思考問題就簡單多了:最長時間即螞蟻離端點的最遠距離。

主要**:

//

輸入int

n,l;

int x[max_n];//

儲存螞蟻的位置

void

solve()

printf(

"%d %d\n

",min_t,max_t);

}

在回頭看這道藍橋杯題:當螞蟻相遇時,同樣可以視為沒有改變方向交錯而過,只是和感冒的螞蟻相遇後另乙隻也會感冒。

考慮兩種情況:

首先看第一只感冒的螞蟻的右端:因為我們考慮的是螞蟻相遇後仍按原方向移動,那麼對於第一只感冒螞蟻右側方向也向右的螞蟻不會被感染( 畫×的螞蟻)

而右側方向向左的螞蟻會與第一只螞蟻相遇而感冒。

之後再看左側:左側的螞蟻這時可能會被右側畫√的螞蟻感染。但左側方向也向左的不會被感染(速度相同,追不上),只有左側方向向右的螞蟻會被感染。

首先看左側螞蟻,思路相同,左側方向向右的螞蟻最終會被感染,而向左的不會。

之後看右側,右側螞蟻可能會被左側畫√的螞蟻感染,但只有右側方向向左的。

綜合這兩張圖可以很發現:在第一只感冒螞蟻左側方向向右的會被感染;右側方向向左的會被感染。所以**就非常簡單。

實現**:

#include//

其實只要求在感冒位置左邊方向向右;右邊方向向左的個數就可以了

const

int max_n = 50

;int

n;int x[max_n+1];//

0:沒有螞蟻 -1:向左 1:向右

int ant; //

感冒螞蟻的位置

void

solve()

for(int i=ant+1; i<=100; i++)

printf(

"%d\n

",res+1);//

加上原來的第一只感冒的螞蟻

}int

main()

solve();

return0;

}

藍橋杯 歷屆試題 螞蟻感冒

分析 1 因為只計算數量,所以螞蟻是掉頭還是直接向前走對本題沒有影響 2 如果感冒的螞蟻方向向左 在它左邊的螞蟻 如果向右,則會感染 如果向左則不會感染 在它右邊的螞蟻 如果向右,則不會感染 如果向左 1 如果感冒的那只螞蟻左邊有向右的螞蟻,他會掉頭,則右邊向左的螞蟻會感冒 2 如果感冒的那只螞蟻左...

藍橋杯歷屆試題 螞蟻感冒

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

藍橋杯 歷屆試題 螞蟻感冒

這道題分析了一下得出的結論就是最後感冒的螞蟻數量等於絕對值比第乙個感冒的螞蟻的位置大的且方向向左,還有就是比第乙個感冒的螞蟻的位置小的且方向向右。這裡我們很明顯可以發現2個螞蟻碰面之後並沒有什麼影響,2個速度相同的螞蟻同時掉頭不如直接看成速度相同的螞蟻繼續向前走 include include in...