藍橋杯 試題 歷屆試題 螞蟻感冒
每隻螞蟻都只能沿著杆子向前爬,速度是1厘米/秒。
當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。
這些螞蟻中,有1隻螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。
請你計算,當所有螞蟻都爬離杆子時,有多少只螞蟻患上了感冒。
接著的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開杆子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,數據中不會出現0值,也不會出現兩隻螞蟻佔用同一位置。其中,第一個數據代表的螞蟻感冒了。
5 -2 8
-10 8 -20 12 25
這一題與 POJ No.1852(Ant)思路相似,首先來看一下POJ的題目:


//輸入 int n,L; int x[Max_N];//保存螞蟻的位置 void solve() { int Min_T = 0, Max_T = 0; for(int i=0; i<n; i++) { Min_T = max( Min_T, min(x[i],L-x[i])); //計算最短時間 Max_T = max( Max_T, max(x[i],L-x[i]));//計算最長時間 } printf("%d %d\n",Min_T,Max_T); }
在回頭看這道藍橋杯題:當螞蟻相遇時,同樣可以視為沒有改變方向交錯而過,只是和感冒的螞蟻相遇後另一隻也會感冒。
考慮兩種情況:
- 第一個數據為正值( 第一隻感冒的螞蟻頭朝右 )

- 再看第一個數據為負值(即第一隻感冒的螞蟻頭朝左)
首先看左側螞蟻,思路相同,左側方向向右的螞蟻最終會被感染,而向左的不會。
之後看右側,右側螞蟻可能會被左側畫√的螞蟻感染,但只有右側方向向左的。
綜合這兩張圖可以很發現:在第一隻感冒螞蟻左側方向向右的會被感染;右側方向向左的會被感染。所以程式碼就非常簡單。
#include<cstdio> //其實只要求在感冒位置左邊方向向右;右邊方向向左的個數就可以了 const int Max_N = 50; int n; int x[Max_N+1];// 0:沒有螞蟻 -1:向左 1:向右 int ant; //感冒螞蟻的位置 void solve() { int res = 0; for(int i=1; i<ant; i++){//左邊 向右 if( x[i]==1 ) res++; } for(int i=ant+1; i<=100; i++){//右邊 向左 if( x[i]==-1 ) res++; } printf("%d\n",res+1);//加上原來的第一隻感冒的螞蟻 } int main() { scanf("%d",&n); int a; scanf("%d",&a); ant = a>0 ? a : -a;//第一個位置是感冒的位置 while( --n ) {//剩下的n-1個 scanf("%d",&a); if( a>0 ) x[a] = 1;//向右 else x[-a] = -1; //向左 } solve(); return 0; }