您的位置:首页 > 其它

[蓝桥杯]-蚂蚁感冒

2017-04-05 20:07 204 查看
问题描述

  长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

  每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。

  当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

  这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

  请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入格式

  第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。

  接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

输出格式

  要求输出1个整数,表示最后感冒蚂蚁的数目。

样例输入

3

5 -2 8

样例输出

1

样例输入

5

-10 8 -20 12 25

样例输出

3

思路:首先判断最左边,如果最左边的不是感冒蚂蚁,且向左爬行,则一定不会感冒,再依次向右判断,直到蚂蚁不再向左爬

     或者遇到感冒的蚂蚁,同理,判断最右边也是一样的思路,

如下图,以

5

-10 8 -20 12 25

感冒蚂蚁kant = -10



感冒蚂蚁向左的情况

1.当最左端是感冒蚂蚁,则直接打印输出,因为它在最左端,同时又右向左爬行

2.当最左端不是感冒蚂蚁,因为上阶段已经排除了最左端向左的非感冒蚂蚁,所以一定是向右的蚂蚁,我们发现,只要左端蚂蚁和感冒蚂蚁爬行方向相反,则一定会有一只蚂蚁得感冒,所以我们利用下标相乘。如-10*8
= -80 为负,则一定存在一只会感冒(可以在8和-10中插入

几只自己实验下),如果感冒蚂蚁右端没蚂蚁,则打印输出,如果有蚂蚁,因为上阶段已经排除了最右端向右的非感冒蚂蚁,所以一定是向左的蚂蚁,如果乘积相同,则一定有一只正常蚂蚁会感冒(可以自己画图思考下)。蚂蚁向左的情况就分析完了。

同理,感冒蚂蚁向右的情况思路一样。

下面是代码

public class Main {

public static void main(String[] args) {
int n, num, temp;
int kant;
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
num = 1;
int ant[] = new int
; // 初始化蚂蚁序列
for (int i = 0; i < n; ++i) {
ant[i] = scan.nextInt();
}
kant = ant[0];
for (int i = 0; i < n - 1; ++i) { // 按绝对值排序,蚂蚁不会在同一个位置,
for (int j = i + 1; j < n; ++j) {
if (Math.abs(ant[i]) > Math.abs(ant[j])) {
temp = ant[i];
ant[i] = ant[j];
ant[j] = temp;
}
}
}

int i = 0;
while (ant[i] < 0 && ant[i] != kant) { // 从最左边判断,如果不是感冒的蚂蚁,且往左则不可能感冒
i++;
}
int j = 1;
while (ant[n - j] > 0 && ant[n - j] != kant) { // 从最右边判断,如果不是感冒的蚂蚁,且往左则不可能感冒
j++;
}

if (kant < 0) {
if (ant[i] == kant) {
System.out.println(num);
return;
} else {
while (ant[i] != kant) {
if (ant[i] * kant < 0) {
num++;
}
i++;
}
}
if (ant[j] == kant) {
System.out.println(num);
return;
} else {
while (ant[n - j] != kant) {
if (ant[n - j] * kant > 0) {
num++;
}
j++;
}
}
} else {
if (ant[j] == kant) {
System.out.println(num);
return;
} else {
while (ant[n - j] != kant) {
if (ant[n - j] * kant < 0) {
num++;
}
j++;
}
}
if (ant[i] == kant) {
System.out.println(num);
return;
} else {
while (ant[i] != kant) {
if (ant[i] * kant > 0) {
num++;
}
i++;
}
}
}
System.out.println(num);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: