解题思路:
两只蚂蚁相遇各自反向可以看作是两只蚂蚁分别继续前进,
然后假如感冒蚂蚁向左行,则会感染它左边所有向右行的蚂蚁,因为它继续向左行,
别感染的第一只蚂蚁继续向右行,感染所有它右边向左行的蚂蚁。
所以可忽略转向,看作是穿过而行(在纸上画画就可以理解,图片来自《挑战程序设计竞赛》第2版第一章例题Ants,不过Ants是求蚂蚁落下竿子的最大最小时间,感兴趣的同学可以试着去vjudge提交,题号为poj 1852),想清楚之后就会发现代码异常简单。比较考验想象力的一道题。
那么我们就可以得到两种情况
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分
16 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复