BUG写手


私信TA

用户名:uq_19400307891

访问量:3220

签 名:

等  级
排  名 2468
经  验 2290
参赛次数 0
文章发表 9
年  龄 18
在职情况 学生
学  校 武汉商学院
专  业 物联网工程

  自我简介:

正在努力变强的大一萌新ACMer

解题思路:

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


所以可忽略转向,看作是穿过而行(在纸上画画就可以理解,图片来自《挑战程序设计竞赛》第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分

19 人评分

  评论区

后面讲解可以简化一下:其实不感染其他蚂蚁的条件就是,同向而行
2023-02-24 21:22:03
强哭我了,好能转换关键点的思路
2022-11-25 09:13:40
代码有误啊,老哥
当感冒蚂蚁为左向左边第一个或右向右边第一个时感冒蚂蚁数为零
2021-05-02 13:57:46
这个思路强!
2021-04-13 10:04:16
这个思路厉害了
2021-03-20 16:17:50
过河卒思路(雾((
牛的
2021-02-22 11:22:58
  • «
  • 1
  • »