栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

蓝桥杯历届试题——蚂蚁感冒(C++版)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯历届试题——蚂蚁感冒(C++版)

1.题目描述

2.输入输出

3.输入输出样例

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

接下来就是要分不同的情况去讨论了,首先是最容易理解的两种情况:

黑色表示初始就感冒的蚂蚁,红色表示本次实验中不会感冒的蚂蚁,蓝色表示是在本次实验中被传染感冒的蚂蚁。(但是想想看,还有两种特殊情况)

特殊情况是这样的:

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

#include
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>a[i];
	}
	if(a[0]>0){
		for(int k=1;kabs(a[0]))
			flag=1;
		}
		for(int i=1;i0 && abs(a[i])a[0] && flag) cold++;//此情况下,感冒的蚂蚁是被后续感冒的蚂蚁影响的 
		}
	}
	if(a[0]<0){
		for(int k=1;k0 && abs(a[k])0 && abs(a[i])abs(a[0]) && flag) cold++;//此情况下,感冒的蚂蚁是被后续感冒的蚂蚁影响的 
		}
	}
	cout< 

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

#include
 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;iabss(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 则不会被感冒除首个感冒 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395955.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号