[蓝桥杯]PREV-27.历届试题_蚂蚁感冒
作者:互联网
问题描述 长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 样例输出 3题目描述
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 bool cmp(int x,int y) 5 { 6 return abs(x)<abs(y); 7 } 8 9 int main(void) 10 { 11 int n; 12 int arr[100+1]; 13 cin >> n; 14 for (int i=0 ; i<n ; i++) 15 { 16 cin >> arr[i]; 17 } 18 int virus = arr[0]; //记录感冒的蚂蚁 19 sort(arr,arr+n,cmp); 20 for (int i=0 ; i<n ; i++)//查找排序后,感冒蚂蚁的位置 21 if (arr[i] == virus) 22 { 23 virus = i; 24 break; 25 } 26 27 28 int l=0,r=0; 29 for (int i=virus+1 ; i<n ; i++) 30 if (arr[i]<0)//往左走的蚂蚁: <<- 31 l ++; 32 33 for (int i=0 ; i<virus ; i++) 34 if (arr[i]>0)//往右走的蚂蚁: ->> 35 r ++; 36 37 int res = 1;//感冒的蚂蚁本体 38 if (arr[virus]>0 && l>0)//如果蚂蚁前进(->>),并存在反向行走的蚂蚁时(将感染) 39 res += (l+r); 40 41 if (arr[virus]<0 && r>0)//如果蚂蚁前进(<<-),并存在反向行走的蚂蚁时(将感染) 42 res += (l+r); 43 44 cout << res; 45 46 return 0; 47 }C++解法
解题思路:
在感冒蚂蚁的前进方向上,如果存在方向相反的蚂蚁,则这些蚂蚁及其反方向的蚂蚁都会被感染
1.对蚂蚁的数据,按绝对值进行排序
2.查找与分别在蚂蚁的左右区域上,[向左走] 和 [向右走] 的蚂蚁数量
3.根据蚂蚁的前进走向( 左 or 右 ),判断在其方向上是否有与其反向的蚂蚁;
若存在,则将会感染[向左走] 和 [向右走] 的蚂蚁
不存在,则感冒的蚂蚁独自离开,感染数为1
标签:arr,27,蚂蚁,int,样例,感冒,蓝桥,Xi,PREV 来源: https://www.cnblogs.com/mind000761/p/10625578.html