蓝桥杯:蚂蚁感冒

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。
并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
格式要求:
在这里插入图片描述
题解:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//自定义绝对值排序 后续用sort对数组进行排序
bool cmp (const int a, const int b)
{
    return abs(a) < abs(b);
}
int main(){
    //先按绝对值排序 相邻之中 左正右负会相遇
    //不需要考虑离开时间 只需要考虑感冒的蚂蚁和几只蚂蚁相遇了
    int n = 0;
    cin>>n;
    //使用一个数组来保存
    vector<int> distance(n);
    for(int i = 0;i<n;i++){
        cin>>distance[i];
    }
    //记录下感冒蚂蚁的相对位置
    int num = distance[0];
    //sort排序
    sort(distance.begin(),distance.end(),cmp);
    
    //记录下感冒了蚂蚁的下标
    int index = 0;
    for(int i = 0;i<n;i++){
        if(num == distance[i]){
            index = i;
        }
    }
    //使用数组记录感冒蚂蚁的下标
    vector<int> ganmao;
    ganmao.push_back(index);
    //用一个数来记录不相遇的蚂蚁对
    int num_2 = 0;
    //多次遍历 寻找会相遇的蚂蚁对
    while(true){
        //归零
        num_2 = 0;
        for(int i = 0;i<n-1;i++){
            if(distance[i]>0 && distance[i+1]<0){
                //会相遇 做一次转换 正负数转
                distance[i] = -distance[i];
                distance[i+1] = -distance[i+1];
                //判断相遇的蚂蚁中是否有感冒的
                if(find(ganmao.begin(),ganmao.end(),i)!= ganmao.end() && find(ganmao.begin(),ganmao.end(),i+1) == ganmao.end()){
                    //有
                    ganmao.push_back(i+1);
                    continue;
                }else if(find(ganmao.begin(),ganmao.end(),i) == ganmao.end() && find(ganmao.begin(),ganmao.end(),i+1)!= ganmao.end()){
                    //有
                    ganmao.push_back(i);
                }
            }else{
                //蚂蚁不相遇
                num_2++;
            }
        }
        //当最后状态是负数全在正数左边是结束
        if(num_2 == n-1){
            break;
        }
    }
    cout<<ganmao.size();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值