解题思路:

两只蚂蚁相遇各自反向可以看作是两只蚂蚁分别继续前进, 
然后假如感冒蚂蚁向左行,则会感染它左边所有向右行的蚂蚁,因为它继续向左行, 
别感染的第一只蚂蚁继续向右行,感染所有它右边向左行的蚂蚁。


所以可忽略转向,看作是穿过而行(在纸上画画就可以理解,图片来自《挑战程序设计竞赛》第2版第一章例题Ants,不过Ants是求蚂蚁落下竿子的最大最小时间,感兴趣的同学可以试着去vjudge提交,题号为poj 1852),想清楚之后就会发现代码异常简单。比较考验想象力的一道题。

1545108072922031.png


那么我们就可以得到两种情况

1.当首只蚂蚁右行,所有右边左行的蚂蚁全部感冒;并且该蚂蚁左边右行的所有蚂蚁全部感冒(该感冒蚂蚁的右边有左行的蚂蚁,这个“并且”结论才成立,如果该感冒蚂蚁右边没有左行的蚂蚁,那么其左边右行的蚂蚁也不会被感染)

2.当首只蚂蚁左行,所有左边右行的蚂蚁全部感冒;并且该蚂蚁右边左行的所有蚂蚁全部感冒(该感冒蚂蚁的左边有右行的蚂蚁,这个“并且”结论才成立,如果该感冒蚂蚁左边没有右行的蚂蚁,那么其右边左行的蚂蚁也不会被感染)

(因为是同等的速度,所以,不会存在后面的蚂蚁追上前面的,而这个竿子长度也是无用条件,不需要去考虑)



参考代码:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[] ant = new int[n];
		for(int i = 0; i < n; i++)
		{
			ant[i] = in.nextInt();
		}
		int cnt = 1;
		int first = ant[0];
		boolean flag = false;
		for(int i = 1; i < n; i++)
		{
			if(first > 0)	//首只蚂蚁右行
			{
				if((Math.abs(ant[i]) > first) && ant[i] < 0)	//所有右边左行的蚂蚁全部感冒
				{
					cnt++;
					flag = true;
				}
				if((Math.abs(ant[i]) < first) && ant[i] > 0)	//该蚂蚁左边右行的所有蚂蚁全部感冒,前提该感冒蚂蚁的右边有左行的蚂蚁
				{
					cnt++;
				}
			}
			else	//首只蚂蚁左行
			{
				if((Math.abs(ant[i]) < Math.abs(first)) && ant[i] > 0)	//所有左边右行的蚂蚁全部感冒,该感冒蚂蚁的左边有右行的蚂蚁
				{
					cnt++;
					flag = true;
				}
				if((Math.abs(ant[i]) > Math.abs(first)) && ant[i] < 0)	//该蚂蚁右边左行的所有蚂蚁全部感冒,前提
				{
					cnt++;
				}
			}
		}
		if(flag)
		{
		    System.out.println(cnt);
		}
		else
		{
		    System.out.println(1);
		}
		
		in.close();
	}


点赞(0)
 

0.0分

16 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 14 条评论

坚果 1年前 回复TA
@坚果 我误会了,哈哈哈哈哈。。。。。。。
坚果 1年前 回复TA
后面讲解可以简化一下:其实不感染其他蚂蚁的条件就是,同向而行
废柴成长中 2年前 回复TA
强哭我了,好能转换关键点的思路
BUG写手 3年前 回复TA
@Catshao 之前写的有点小瑕疵,现在改了,再看看有没有什么问题
BUG写手 3年前 回复TA
@胜 已经改了,再看看
BUG写手 3年前 回复TA
@胜 应该这么写,如果感冒蚂蚁左行,那么它左边右行的蚂蚁感冒,这个时候,感冒蚂蚁右边左行的蚂蚁才会感冒。感冒蚂蚁右行同理。
BUG写手 3年前 回复TA
@胜 感谢
BUG写手 3年前 回复TA
@胜 应该是1
BUG写手 3年前 回复TA
@胜 那这应该是特例,测试数据里边可能没有,再加个判断改一下就行
3年前 回复TA
代码有误啊,老哥
当感冒蚂蚁为左向左边第一个或右向右边第一个时感冒蚂蚁数为零