蚂蚁感冒 刷题笔记

/*
解题思路

首先根据题意可知  
1.蚂蚁速度均为1  即同向蚂蚁永远不可能追上
我们需要求最后感冒蚂蚁的数量
因为蚂蚁碰头将会掉头
效果和俩蚂蚁互相穿过继续走是一样的
所以我们将俩蚂蚁碰头视作穿过
2.
如果俩蚂蚁相向而行 则俩蚂蚁必定碰头

 
首先 我们获得第一个感冒蚂蚁的位置和方向
开始第一次遍历 找该蚂蚁左边是否存在可以被感冒的蚂蚁 
并且标记一个mask 
用来记录该蚂蚁左边是否存在向右走的蚂蚁 
如果第一个蚂蚁向左走  
且该蚂蚁的左边存在向右走的蚂蚁 
  每遇到一个向右走的蚂蚁则 计数器+1
并且 一旦这个向左走的蚂蚁遇到一个向右的蚂蚁
将mask标记做一个修改 
此时我们就获得了向右走的感冒蚂蚁 

然后我们开始第二次搜索 
找该蚂蚁右边是否存在可以被感冒的蚂蚁
首先如果刚刚的mask被修改过
则存在向右走的感冒蚂蚁
为了计数的方便我们将碰头视作穿过
但实际是反向 因此第一只向右走的感冒蚂蚁的位置实际是a[0]的位置
于是我们第二次搜索条件就是 位置在a[0]右边且向左走的蚂蚁
遇到一只则计数器++;


如果第一只蚂蚁向右左则对称分析即可

*/ 

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int a[N];
int cnt=1;
int main(){
    
    int n;
    cin>>n;
    cin>>a[0];
    bool mask=true;
    int mask2=0;
    if(a[0]<0){
            a[0]=-a[0];
            mask=false;
        
        for(int i=1;i<n;i++){
            cin>>a[i];
            if((mask==false)&&a[i]>0&&a[i]<a[0]){
                cnt++;
                mask2=1; 
                //cout<<"1++"<<endl<<a[i]<<endl;
            }
            
        }
        for(int i=1;i<n;i++){
            if(mask2==1&&a[i]<0&&abs(a[i])>a[0]){
                cnt++;
                ///cout<<"2++"<<endl<<a[i]<<endl;;
            }
            
        }
    }else{
        for(int i=1;i<n;i++)
        {
            cin>>a[i];
            if(a[i]<0&&abs(a[i])>a[0]){
                mask2=1;
                cnt++;
            }
        } 
        for(int i=1;i<n;i++)
        {
            
            if(mask2==1&&a[i]>0&&abs(a[i])<a[0]){
                cnt++;
                
            }
        } 
    }
    cout <<cnt;
    return 0;
}
 

  • 21
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值