蓝桥杯历届试题——蚂蚁感冒(模拟)

1.题目描述
在这里插入图片描述
2.输入输出
在这里插入图片描述
3.输入输出样例
在这里插入图片描述
4.解题思路
首先对于本题,有一个更高层的抽象:题目中说到两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。其实这就等同于两只蚂蚁互相路过继续沿杆方向前进,而得了感冒的蚂蚁,则会将感冒传染给从它身边路过的蚂蚁。

接下来就是要分不同的情况去讨论了,首先是最容易理解的两种情况:
在这里插入图片描述
黑色表示初始就感冒的蚂蚁,红色表示本次实验中不会感冒的蚂蚁,蓝色表示是在本次实验中被传染感冒的蚂蚁。(但是想想看,还有两种特殊情况)

特殊情况是这样的:
在这里插入图片描述
在这种情况中,没有一只蚂蚁会与初始感冒的蚂蚁相向而行,要么背道而驰,要么同向前进。那么此时除了初始感冒的蚂蚁以外,就不会有任一一只蚂蚁感冒。
我的代码如下:

#include<bits/stdc++.h>
using namespace std;
#define maxn 55
int a[maxn];
int cold=1;
int flag=0;
int main() {
	memset(a,0,sizeof a);
	int n;
	cin>>n;
	for(int i=0;i<n;i++){//数据输入 
		cin>>a[i];
	}
	if(a[0]>0){
		for(int k=1;k<n;k++){//该循环是为了遍历每一只蚂蚁的状态,如果出现了相向而行的状态,则将flag置为1 
			if(a[k]<0 && abs(a[k])>abs(a[0]))
			flag=1;
		}
		for(int i=1;i<n;i++){
			if(a[i]>0 && abs(a[i])<a[0]) cold++;//该情况下,只要相向而行,感冒数+1 
			else if(a[i]<0 && abs(a[i])>a[0] && flag) cold++;//此情况下,感冒的蚂蚁是被后续感冒的蚂蚁影响的 
		}
	}
	if(a[0]<0){
		for(int k=1;k<n;k++){//同理, 该循环是为了遍历每一只蚂蚁的状态,如果出现了相向而行的状态,则将flag置为1
		if(a[k]>0 && abs(a[k])<abs(a[0]))
		flag=1;
		}
		for(int i=1;i<n;i++){
			if(a[i]>0 && abs(a[i])<abs(a[0])) cold++;//该情况下,只要相向而行,感冒数+1
			else if(a[i]<0 && abs(a[i])>abs(a[0]) && flag) cold++;//此情况下,感冒的蚂蚁是被后续感冒的蚂蚁影响的 
		}
	}
	cout<<cold;
	return 0;
	
	
	

}

从网上找来一个优化的代码,更加简洁,思路更清晰,值得学习

#include<stdio.h>
 int abss(int s)//取绝对值 
 { if(s<0)return -s;
    else return s;
 }
int  main()
{
  int qans=0,hans=0,n,i,gm,s;
  scanf("%d",&n); 
  scanf("%d",&gm);//gm 首个感冒蚂蚁 位值 
    for(i=1;i<n;i++)
     {
       scanf("%d",&s);
       if(abss(gm)<abss(s)&&s<0)hans++;//当在首个蚂蚁右侧并且反向 必感冒 
       if(abss(gm)>abss(s)&&s>0)qans++;//当在首个蚂蚁左侧并且正向 必感冒 
     }
  if(gm>0&&hans!=0||gm<0&&qans!=0)printf("%d",qans+hans+1);
   else printf("1");//当首个感冒蚂蚁方向为正时 在首个蚂蚁右侧并且反向 为 0 或  
return 0; //当首个感冒蚂蚁方向为负时 在首个蚂蚁左侧并且反向 为 0 则不会被感冒除首个感冒 
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chase__young

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值