藍橋杯2014年c/c++|B組08(螞蟻感冒)

標題:螞蟻感冒
長100釐米的細長直杆子上有n只螞蟻。它們的頭有的朝左,有的朝右。

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

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

這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。

請你計算,當所有螞蟻都爬離杆子時,有多少隻螞蟻患上了感冒。
1
2
3
4
5
6
7
8
9
【數據格式】
第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。

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

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

其中,第一個數據代表的螞蟻感冒了。

要求輸出1個整數,表示最後感冒螞蟻的數目。
1
2
3
4
5
6
7
8
9
例如,輸入:
3
5 -2 8

程序應輸出:
1

再例如,輸入:
5
-10 8 -20 12 25

程序應輸出:
3

資源約定:
峯值內存消耗 < 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章