蚂蚁感冒
- 1.题目
- 2.基本思想
- 3.代码实现
1.题目
长 100 厘米的细长直杆子上有 n n n 只蚂蚁。
它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有 1 只蚂蚁感冒了。
并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数
n
n
n, 表示蚂蚁的总数。
接着的一行是 n n n 个用空格分开的整数 Xi, Xi 的绝对值表示蚂蚁离开杆子左边端点的距离。
正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。
其中,第一个数据代表的蚂蚁感冒了。
输出格式
输出1个整数,表示最后感冒蚂蚁的数目。
数据范围
1
<
n
<
50
,
1<n<50,
1<n<50,
0
<
∣
X
i
∣
<
100
0<|Xi|<100
0<∣Xi∣<100
输入样例:
3
5 -2 8
输出样例:
1
输入样例:
5
-10 8 -20 12 25
输出样例:
3
2.基本思想
当两只蚂蚁碰面时,它们同时掉头往相反的方向爬行就等价于两只蚂蚁相互穿过对方,由此不用管题目的掉头
可看出对于 左边蚂蚁向右 与 右边蚂蚁向左时,无论感染的蚂蚁朝向如何都不会被感染!因而只有两种情况可被感染。
因而仅需要考虑这两种情况,即蚂蚁感冒数 R L + L R + 1 (右边朝左与左边朝右外加自身 1 )否则为 1 因而仅需要考虑这两种情况,即 蚂蚁感冒数 RL+LR+1 (右边朝左 与 左边朝右 外加 自身1)否则为 1 因而仅需要考虑这两种情况,即蚂蚁感冒数RL+LR+1(右边朝左与左边朝右外加自身1)否则为1
3.代码实现
import java.util.Scanner;
import static java.lang.Math.abs;
public class _1211蚂蚁感冒 {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int n = sc.nextInt();
int a[] = new int[n];
for (int i = 0; i < n; i++)
a[i] = sc.nextInt();// a[i] +:向右 -:向左
// 左向右 右向左 蚂蚁的数量
int leftToRight = 0, rightToLeft = 0;
for (int i = 0; i < n; i++) {
//如果在感冒蚂蚁的左边 且 方向向左
if (abs(a[i]) < abs(a[0]) && a[i] > 0) leftToRight++;
//如果在感冒蚂蚁的右边 且 方向向左
else if (abs(a[0]) < abs(a[i]) && a[i] < 0) rightToLeft++;
}
//判断是否存在 感冒蚂蚁右 且有右向左的蚂蚁 冒蚂蚁向左 且有左向右的蚂蚁
if ((a[0] > 0 && rightToLeft > 0) || (a[0] < 0 && leftToRight > 0)) {
System.out.println(leftToRight + rightToLeft + 1);
} else
System.out.println(1);//本身感染
}
}