2014C++A:蚂蚁感冒(数组+判断)

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

输入
    第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
    接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,
    表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,
    数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代
    表的蚂蚁感冒了。
输出
    要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入1
    3
    5 -2 8
样例输入2
    5
    -10   8   -20  12   25
样例输出分别为
    1
    3

1.分析思路: 

  • 样例1:3个蚂蚁
    在这里插入图片描述
    感冒的蚂蚁是-2这个位置的,它会一直朝左走,所以表示不会感染到其他蚂蚁,
    所以感冒蚂蚁的个数就为1
  • 样例2:5个蚂蚁
    在这里插入图片描述
    位置在8的蚂蚁感冒,他会与位置为10的蚂蚁相遇,然后两只蚂蚁掉头,8蚂蚁变为朝左,10蚂蚁变为朝右,之后10蚂蚁会与位置为20的蚂蚁相遇,20蚂蚁变为朝右,
    所以会有3只蚂蚁感冒
  • 感冒蚂蚁在他前面的:同向的永远追不上,反向的都会感冒;
  • 感冒蚂蚁在他后面的,同向的可能会感冒(取决于他前面的蚂蚁方向),反向的一定不会感冒。
    2.代码:
#include<iostream>
using namespace std;

int main(){
	int n;
scanf("%d",&n);
int arr[n];
for(int i=0;i<n;i++){
	scanf("%d",&arr[n]);
}
int x=arr[0];  //第一个蚂蚁,也就是感冒蚂蚁
//有两种情况,第一个蚂蚁朝左或者朝右,二者只能为其一 
if(x>0){   //当第一个蚂蚁为朝右的时
int ans=1;
for(int i=0;i<n;i++){  //把所有蚂蚁扫描一遍,确定其左右方向 
	if(arr[i]<0&&-arr[i]>x)  //遇到朝左的蚂蚁,掉头变为朝右的
	ans++; 
} 
if(ans!=1)  //从右到左,判断右边是否有朝左的蚂蚁
 for(int i=0;i<n;i++){
 	if(arr[i]>0&&arr[i]<x)  //如果蚂蚁朝右就会一直朝右
	 ans++; 
 } 
 printf("%d\n",ans);
} 
if(x<0){ //第一个蚂蚁朝左,也就是感冒蚂蚁
//左侧从左到右判断
int ans=1;
for(int i=0;i<n;i++){
	if(arr[i]>0&&arr[i]<-x) //感冒蚂蚁左侧有蚂蚁朝右,遇到后,方向会反向
	ans++; 
}
if(ans!=1) //在左侧,从左到右,判断是否有蚂蚁感冒
for(int i=0;i<n;i++){
	if(arr[i]<0&&-arr[i]>-x)
	ans++;
} 
printf("%d\n",ans);
}
return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值