标題:螞蟻感冒
長100厘米的細長直杆子上有n隻螞蟻。它們的頭有的朝左,有的朝右。
每隻螞蟻都隻能沿着杆子向前爬,速度是1厘米/秒。
當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。
這些螞蟻中,有1隻螞蟻感冒了。并且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。
請你計算,當所有螞蟻都爬離杆子時,有多少隻螞蟻患上了感冒。
【資料格式】
第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。
接着的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開杆子左邊端點的距離。
正值表示頭朝右,負值表示頭朝左,資料中不會出現0值,也不會出現兩隻螞蟻占用同一位置。
其中,第一個資料代表的螞蟻感冒了。
要求輸出1個整數,表示最後感冒螞蟻的數目。
例如,輸入:
3
5 -2 8
程式應輸出:
1
再例如,輸入:
5
-10 8 -20 12 25
資源約定:
峰值記憶體消耗 < 256M
CPU消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入…” 的多餘内容。
所有代碼放在同一個源檔案中,調試通過後,拷貝送出該源碼。
注意: main函數需要傳回0
注意: 隻使用ANSI C/ANSI C++ 标準,不要調用依賴于編譯環境或作業系統的特殊函數。
注意: 所有依賴的函數必須明确地在源檔案中 #include , 不能通過工程設定而省略常用頭檔案。
送出時,注意選擇所期望的編譯器類型。
思路
當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行,可以了解為穿過。
在感冒螞蟻右邊的螞蟻:
向右——》不會被傳染
向左——》會被傳染
在感冒螞蟻左邊的螞蟻:
向右——》感冒螞蟻右邊有向左的螞蟻會被傳染,否則不會被傳染
向左——》不會被傳染
在感冒螞蟻左邊的螞蟻:
向右——》會被傳染
向左——》不會被傳染
在感冒螞蟻右邊的螞蟻:
向右——》不會被傳染
向左——》感冒螞蟻左邊有向右的螞蟻會被傳染,否則不會被傳染
在感冒螞蟻前進路上且方向相反的螞蟻會被傳染
在感冒螞蟻相反路上但前進方向與感冒螞蟻相同的螞蟻如果上一個條件有被傳染的螞蟻則全被傳染否則不會被傳染
Code
C\C++
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int x,n,m,cnt=0,pole[100];
memset(pole,0,sizeof(pole));
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
pole[abs(x)]=x;
if(i==0) m=x;
}
for(int i=100;i>=abs(m);i--)
if(pole[i]<0) cnt++;
for(int i=0;i<=abs(m);i++)
if(pole[i]>0) cnt++;
cout<<cnt<<endl;
return 0;
}
Python
count = 1
_ = int(input())
nums = list(map(int, input().split()))
if nums[0] > 0:
for i in nums:
if nums[0] * i < 0 and abs(i) > abs(nums[0]):
count += 1
for i in nums:
if count > 1 and abs(i) < abs(nums[0]) and nums[0] * i > 0:
count += 1
if nums[0] < 0:
for i in nums:
if nums[0] * i < 0 and abs(i) < abs(nums[0]):
count += 1
for i in nums:
if count > 1 and abs(i) > abs(nums[0]) and nums[0] * i > 0:
count += 1
print(count)