蓝桥杯-蚂蚁感冒(容易理解java篇)
问题描述
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
思路:当蚂蚁碰头时,两蚂蚁都会进行调头,所以绳子上的蚂蚁的头朝向是不会发生改变的,所以一定会等着病原体来传染,所以答案就是
病原体左边头朝右的蚂蚁个数+1+病原体右边头朝左的蚂蚁个数
代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//蚂蚁感冒:每个蚂蚁都会互相碰撞,互相*掉头*,则头朝右和头朝左的蚂蚁数量是不会发生改变的,所以这些蚂蚁一定会等着感冒体来碰撞
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int danger = -1;//危险的蚂蚁,判断头的方向
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < n; i++) {//取出剩下的蚂蚁
if (i == 0) {
danger = scanner.nextInt();
arrayList.add(danger);
} else
arrayList.add(scanner.nextInt());
}
Collections.sort(arrayList, new Comparator<Integer>() {//从小到大排序
@Override
public int compare(Integer o1, Integer o2) {
return Math.abs(o1) - Math.abs(o2);
}
});
int leftCount = 0;//头朝左在病原体之后的蚂蚁个数
int rightCount = 0;//头朝右在病原体之前的蚂蚁个数
boolean b = false;//判断是否到了病原体的左边,才好给leftCount计数
for (int i = 0; i < arrayList.size(); i++) {
int m = arrayList.get(i);
if (m == danger) {//病原体不能计算在里面
b = true;
continue;
}
if (b) {
if (m < 0)
leftCount++;
} else {
if (m > 0)
rightCount++;
}
}
//先判断下左边是否有往右走的蚂蚁->>,如果没有,那感冒个数就只有病原体一个了
if (danger < 0) {//说明病原体头往左
if (leftCount == 0) {
System.out.println(1);//病原体
} else
System.out.println(leftCount + rightCount + 1);
} else {//往右,同上
if (rightCount == 0) {
System.out.println(1);
} else
System.out.println(leftCount + rightCount + 1);
}
}
}