1. 程式人生 > >藍橋杯 歷屆試題 螞蟻感冒

藍橋杯 歷屆試題 螞蟻感冒

資源 har get fin 螞蟻 lis 一行 space std

Description

長100厘米的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。
每只螞蟻都只能沿著桿子向前爬,速度是1厘米/秒。
當兩只螞蟻碰面時,它們會同時掉頭往相反的方向爬行。
這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。
請你計算,當所有螞蟻都爬離桿子時,有多少只螞蟻患上了感冒。

Input

第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。

接著的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開桿子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,數據中不會出現0值,也不會出現兩只螞蟻占用同一位置。其中,第一個數據代表的螞蟻感冒了。

Output

要求輸出1個整數,表示最後感冒螞蟻的數目。

Sample Input

例如,輸入:
3
5 -2 8

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

Sample Output

程序應輸出:
1

程序應輸出:
3

Hint

資源約定:
峰值內存消耗 < 256M
CPU消耗 < 1000ms

Source

藍橋杯 分析: 思維題 兩個螞蟻相碰相當於穿過
所以不管第一個感冒的螞蟻是向左還是向右
只要統計一下
第一個感冒的螞蟻的左邊向右走的+第一個感冒的螞蟻的右邊向左走的 code:
#include<stdio.h>
#include
<iostream> #include<math.h> #include<string.h> #include<set> #include<map> #include<list> #include<math.h> #include<queue> #include<algorithm> using namespace std; typedef long long LL; #define INF 99999999 #define me(a,x) memset(a,x,sizeof(a)) int
mon1[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; int mon2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31}; int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; LL getval() { LL ret(0); char c; while((c=getchar())== ||c==\n||c==\r); ret=c-0; while((c=getchar())!= &&c!=\n&&c!=\r) ret=ret*10+c-0; return ret; } void out(int a) { if(a>9) out(a/10); putchar(a%10+0); } #define max_v 55 int a[max_v]; bool cmp(int x,int y) { return abs(x)<abs(y); } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) scanf("%d",&a[i]); int temp=a[0],k=0; sort(a,a+n,cmp); for(int i=0;i<n;i++) { if(a[i]==temp) { k=i; break; } } int ans=0; for(int i=0;i<k;i++) { if(a[i]>0) ans++; } for(int i=k+1;i<n;i++) { if(a[i]<0) ans++; } cout<<ans+1<<endl; } } /* 思維題 兩個螞蟻相碰相當於穿過 所以不管第一個感冒的螞蟻是向左還是向右 只要統計一下 第一個感冒的螞蟻的左邊向右走的+第一個感冒的螞蟻的右邊向左走的 */

藍橋杯 歷屆試題 螞蟻感冒