藍橋杯2023年C B組 8 螞蟻感冒

2021-10-16 17:30:06 字數 1823 閱讀 9333

長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這題有乙個小技巧,如果把每次螞蟻的碰撞看成是穿越過去了,就會大大地簡化分析過程

我們把第一只感冒了的螞蟻看成是mid(即中間的螞蟻)

那麼就有下面的幾種情況

1.如果mid螞蟻向右走,且mid右邊所有的螞蟻都是向右走,那麼就沒有螞蟻會被感染

2.如果mid螞蟻向右走,且mid右邊有向左走的螞蟻,那麼mid右邊所有向左走的螞蟻都會被感染

與此同時,如果mid左邊有向右走的螞蟻,那麼mid左邊所有向右走的螞蟻也會被感染

mid螞蟻向左走的情況和上述同理

實現的**如下

#include#includeusing namespace std;

const int n = 100;

int q[n];

int n;

int main()

if (right_to_left == 0)

cout << "1";

else if (right_to_left > 0)

cout << right_to_left + left_to_right + 1 << endl; }

if (a < 0) //若第一只螞蟻向左走

if (left_to_right == 0)

cout << "1" << endl;

else if (left_to_right > 0)

cout << left_to_right + right_to_left + 1 << endl; }

return 0;

}

以下為錯誤的做法??

我用這個程式把整個螞蟻運動的過程進行模擬

每次迴圈就會把所有的螞蟻都依次運動,如果有碰頭的螞蟻就會把螞蟻反向

實現**如下:

#include#includeusing namespace std;

struct antant[100];

int n, num,temp;

void chongdie(int i)}}

}void move(int i)

}void init()

}int main()

while (temp != 0)

}int cnt=0;

for (int i = 0; i < n; i++)

cout << cnt;

}

總結:

做這題的時候,由於看到這題的資料範圍不大,而且過程不算繁瑣,就理所當然地想到了通過模擬整個過程暴力解題的方法。

如果能在動手前能多分析分析,把螞蟻的碰撞看成是穿越,這樣整個過程就能被大大地簡化。

2014藍橋杯 8 螞蟻感冒

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

2014藍橋杯本科B組 螞蟻感冒

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

藍橋杯2014 螞蟻感冒

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