藍橋杯 螞蟻感冒

2021-06-29 08:16:59 字數 1116 閱讀 6725

時間限制: 1 sec  

記憶體限制: 128 mb

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

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

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

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

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

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

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

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

3

5 -2 8

1

分析:  1、當兩隻螞蟻碰撞之後掉頭和互換位置是一樣的,對結果沒有影響。

2、然後給螞蟻位置排序,因為第一只螞蟻有兩個朝向,所以分為兩種情況:

(1)當第一只螞蟻朝右時,則所有絕對值比它大的且向左運動的螞蟻會感染,所有絕對值比它小的且向右運動的螞蟻會感染。

(2)反之亦然。

3、上面的方法有種特殊情況,就是第一只螞蟻不感染其他螞蟻時,即它向左時,絕對值最小,它向右時,絕對值最大。排除這種情況就ac了。

language:c++

code:

#include #include using namespace std;

int main()

if(abs(a)abs(tmp)&&a*tmp>0&&tmp<0)

cnt++;

if(abs(a)>abs(tmp)&&a*tmp<0&&tmp>0) //第一只螞蟻向右運動

cnt++;

if(abs(a)0&&tmp>0)

cnt++;

if(abs(a)>max)

max=abs(a);

if(abs(a)0&&abs(tmp)==max)) //判斷第一只螞蟻是否會感染其他螞蟻

cout<<1;

else

cout<

藍橋杯 螞蟻感冒

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

藍橋杯 螞蟻感冒

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

藍橋杯 螞蟻感冒

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