藍橋杯-螞蟻感冒

小程xy發表於2024-05-07

長 100 釐米的細長直杆子上有 n 只螞蟻。

它們的頭有的朝左,有的朝右。

每隻螞蟻都只能沿著杆子向前爬,速度是 1 釐米/秒。

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

這些螞蟻中,有 1 只螞蟻感冒了。

並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。

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

輸入格式

第一行輸入一個整數 n, 表示螞蟻的總數。

接著的一行是 n 個用空格分開的整數 Xi, Xi 的絕對值表示螞蟻離開杆子左邊端點的距離。

正值表示頭朝右,負值表示頭朝左,資料中不會出現 0 值,也不會出現兩隻螞蟻佔用同一位置。

其中,第一個資料代表的螞蟻感冒了。

輸出格式

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

資料範圍

1<n<50,
0<|Xi|<100

輸入樣例1:

3
5 -2 8

輸出樣例1:

1

輸入樣例2:

5
-10 8 -20 12 25

輸出樣例2:

3

題解:

這題正常模擬的話, 比較麻煩, 而且容易出錯, 這裡我們換個思路~

  • 感冒的螞蟻和正常的螞蟻相撞後轉向, 相當於這兩隻螞蟻穿過對方, 繼續按照原來的方向爬行, 正常的螞蟻變的感冒
  • 設第一隻感冒的螞蟻是 x, 不論 x 是向左還是向右, x 左邊的向左爬的螞蟻 和 x 右邊的向右爬的螞蟻 都不會被感染

下面這句話, 結合著下圖看比較好理解 --> (圖中的 l 和 r 代表的是 x左邊的向右爬的螞蟻的數量 和 x右邊的向左爬的螞蟻的數量)
假設 x 向右, 那麼 x 右邊的 向左爬的螞蟻一定被感染, 如果存在 "右邊的 向左爬的螞蟻", 那麼 x 左邊的向右爬的螞蟻同樣會被感染, 否則 "x 左邊的向右爬的螞蟻同樣會被感染" 不會被感染

x 向左的話, 跟向右的情況相反, x左邊向右的一定感染, 如果存在 "x左邊向右的", 那麼 x 右邊向左的才會被感染, 否則不會


ac程式碼👇

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main()
{
    int n; cin >> n;
    v.resize(n);
    for (int i = 0; i < n; i ++) cin >> v[i];
    
    int t = abs(v[0]);
    int l = 0, r = 0;   // 左邊 向右走的, 和 右邊 向左走的
    for (int i = 0; i < n; i ++)
        if (abs(v[i]) < t && v[i] > 0) l ++;
        else if (abs(v[i]) > t && v[i] < 0) r ++;
    
    if ((v[0] < 0 && l == 0) || (v[0] > 0 && r == 0)) cout << 1 << endl;
    else cout << l + r + 1 << endl;
    return 0;
}

覺得寫的不錯的話, 點個贊吧~