長 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;
}
覺得寫的不錯的話, 點個贊吧~