蚂蚁感冒

蚂蚁感冒

https://www.luogu.com.cn/problem/P8611)

日常解读一下题目,首先,已知已经有一只蚂蚁感冒了,当这只蚂蚁与其他蚂蚁碰头的时候,感冒会传染,问当所有蚂蚁离开这个木棍后,共有几只蚂蚁感冒了

题目还说,两只蚂蚁相碰时,会掉头 --> 这个可能会有点误区,就一直在想怎么去写掉头,我们简化一下,两只蚂蚁(有一只是感染的)碰头,那么两只最终都会称为感染者,那么掉不掉头有什么关系呢,一直向前走就是了。

解读到上边,那么问题就成了以最开始感染的蚂蚁为起点,向左/向右遍历一遍,看看有没有方向相反的蚂蚁,如果有那么感染者+1 且此时还要向右/向左遍历一遍,检查最开始感染的蚂蚁另一边有没有方向相反的蚂蚁,有就+1.反之就不用再遍历了,因为蚂蚁的速度是一样的,不存在追及问题

ACODE


#include <bits/stdc++.h>

#define ll long long
#define endl '\n'
using namespace std;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n; cin >> n;
    vector<int> ans(101);int begin;
    for (int i = 1; i <= n; i++) {
        int a; cin >> a;
        if(i == 1){
            ans[abs(a)] = -1;
            begin = a;
        }
        else{
            if(a < 0)ans[abs(a)] = -2;
            else ans[a] = 1;
        }
    }
    int count = 1;
    if(begin > 0){
        for (int i = begin+1; i <= 100; i++) {
            if(ans[i] < 0)count ++;
        }
        if(count != 1){
            for (int i = 1; i <= begin-1; i++) {
                if(ans[i] > 0)count++;
            }
        }
    }else{
        for (int i = 1; i < abs(begin); i++) {
            if(ans[i] > 0)count++;
        }
        if(count != 1) {
            for (int i = abs(begin)+1; i <= 100; i++) {
                if (ans[i] < 0)count++;
            }
        }
    }
    cout << count << endl;
    return 0;
}
posted @ 2023-02-19 16:35  TFOREVERY  阅读(29)  评论(0编辑  收藏  举报