藍橋杯 PREV-27 歷屆試題 螞蟻感冒
問題描述
長100釐米的細長直杆子上有n只螞蟻。它們的頭有的朝左,有的朝右。
每隻螞蟻都只能沿著杆子向前爬,速度是1釐米/秒。
當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。
這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。
請你計算,當所有螞蟻都爬離杆子時,有多少隻螞蟻患上了感冒。
輸入格式
第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。
接著的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開杆子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,資料中不會出現0值,也不會出現兩隻螞蟻佔用同一位置。其中,第一個資料代表的螞蟻感冒了。
輸出格式
要求輸出1個整數,表示最後感冒螞蟻的數目。
樣例輸入
3
樣例輸出
1
樣例輸入
5
樣例輸出
3
分析:1.兩隻螞蟻相遇,他們都掉頭,不妨把他們看作交換身體,和各走各的效果一樣的
2.記錄感冒螞蟻中, lr在左面往右爬, ll在左面往左爬, rl在右面往左爬, rr在右面往右爬的數量
3.如果感冒螞蟻往左爬, 那lr會被該螞蟻傳染, lr會傳染rl。所以,如果lr>0,會傳給rl螞蟻,答案為lr + rl,如果lr= 0那lr不會被傳染,更不會傳染給rl,答案為1,即最開始的一隻感冒的。感冒螞蟻往右爬同理~
#include <iostream> #include <cmath> using namespace std; int main() { int n, cold, t, ll = 0, lr = 0, rl = 0, rr = 0, ans = 0; cin >> n >> cold; for (int i = 0; i < n - 1; i++) { cin >> t; if (t > 0) { if (abs(t) < abs(cold)) lr++; else rr++; } else { if (abs(t) < abs(cold)) ll++; else rl++; } } if (cold < 0) { if (lr > 0) ans = lr + rl + 1; else ans = 1; } else { if (rl > 0) ans = rl + lr + 1; else ans = 1; } cout << ans; return 0; }ofollow,noindex" target="_blank">❤❤點選這裡 -> 訂閱PAT、藍橋杯、GPLT天梯賽、LeetCode題解離線版❤❤
