题目链接:AcWing 1211. 蚂蚁感冒
长 100 厘米的细长直杆子上有 n只蚂蚁。
它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是 1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有 1只蚂蚁感冒了。
并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数 n, 表示蚂蚁的总数。
接着的一行是 n个用空格分开的整数 Xi, Xi的绝对值表示蚂蚁离开杆子左边端点的距离。
正值表示头朝右,负值表示头朝左,数据中不会出现 0值,也不会出现两只蚂蚁占用同一位置。
其中,第一个数据代表的蚂蚁感冒了。
输出格式
输出1个整数,表示最后感冒蚂蚁的数目。
数据范围
1<n<50,0<|Xi|<100
输入样例1:
3
5 -2 8
输出样例1:
1
输入样例2:
5
-10 8 -20 12 25
输出样例2:
3
程序说明:
两只蚂蚁相遇后就各自掉头,由于速度一样,只是方向不一样,因此可以看作两只蚂蚁互相穿过对方继续前进。
只有第一只蚂蚁感染的情况:第一只蚂蚁向右走,其右边没有一只蚂蚁向左走;或是第一只蚂蚁向左走,其左边没有一只蚂蚁向右走。
除了以上特殊情况,第一只蚂蚁向右走时,其右边向左走的蚂蚁一定被传染,然后被传染的蚂蚁又会传染给第一只蚂蚁的左边向右走的蚂蚁。因此只要统计出第一只蚂蚁左边往右走的,和右边往左走的蚂蚁的数量,再加1即为正确答案。
第一只蚂蚁向左走同理。
代码如下:
#include <iostream>
using namespace std;
const int N = 110;
int n, a[N], cnt, first, l, r;
int main() {
cin>>n;
for(int i = 0; i < n; i++) {
cin>>a[i];
if(i == 0) first = a[i];
}
for(int i = 1; i < n; i++) {
if(abs(a[i]) < abs(first) && a[i] > 0) l++;
if(abs(a[i]) > abs(first) && a[i] < 0) r++;
}
//只有一只蚂蚁感冒的情况
if(first > 0 && r == 0 || first < 0 && l == 0)
cout<<1<<endl;
else
cout<<l + r + 1;
return 0;
}