解题思路:
两只蚂蚁相遇各自反向可以看作是两只蚂蚁分别继续前进,
然后假如感冒蚂蚁向左行,则会感染它左边所有向右行的蚂蚁,因为它继续向左行,
别感染的第一只蚂蚁继续向右行,感染所有它右边向左行的蚂蚁。
所以可忽略转向,看作是穿过而行(在纸上画画就可以理解,图片来自《挑战程序设计竞赛》第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分
19 人评分
WU-蓝桥杯算法提高VIP-Quadratic Equation (C++代码)浏览:1808 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:821 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:593 |
用筛法求之N内的素数。 (C语言代码)浏览:890 |
【矩阵】 (C++代码)浏览:999 |
Cylinder (C语言描述,蓝桥杯)浏览:1279 |
大家好,我是验题君浏览:604 |
C二级辅导-温度转换 (C语言代码)浏览:802 |
图形输出 (C语言代码)浏览:1019 |
C二级辅导-统计字符 (C语言代码)浏览:695 |
坚果 2023-02-24 21:26:46 |
我误会了,哈哈哈哈哈。。。。。。。