蓝桥杯 蚂蚁感冒【模拟】

题目链接:AcWing 1211. 蚂蚁感冒

长 100 厘米的细长直杆子上有 n只蚂蚁。

它们的头有的朝左,有的朝右。

每只蚂蚁都只能沿着杆子向前爬,速度是 1厘米/秒。

当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有 1只蚂蚁感冒了。

并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入格式

第一行输入一个整数 n, 表示蚂蚁的总数。

接着的一行是 n个用空格分开的整数 Xi, Xi的绝对值表示蚂蚁离开杆子左边端点的距离。

正值表示头朝右,负值表示头朝左,数据中不会出现 0值,也不会出现两只蚂蚁占用同一位置。

其中,第一个数据代表的蚂蚁感冒了。

输出格式

输出1个整数,表示最后感冒蚂蚁的数目。

数据范围

1

输入样例1:

3
5 -2 8

输出样例1:

1

输入样例2:

5
-10 8 -20 12 25

输出样例2:

3

程序说明:

两只蚂蚁相遇后就各自掉头,由于速度一样,只是方向不一样,因此可以看作两只蚂蚁互相穿过对方继续前进。

只有第一只蚂蚁感染的情况:第一只蚂蚁向右走,其右边没有一只蚂蚁向左走;或是第一只蚂蚁向左走,其左边没有一只蚂蚁向右走。

除了以上特殊情况,第一只蚂蚁向右走时,其右边向左走的蚂蚁一定被传染,然后被传染的蚂蚁又会传染给第一只蚂蚁的左边向右走的蚂蚁。因此只要统计出第一只蚂蚁左边往右走的,和右边往左走的蚂蚁的数量,再加1即为正确答案。

第一只蚂蚁向左走同理。

代码如下:

#include 
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;
}

你可能感兴趣的:(蓝桥杯,#,模拟/枚举/排序)