[蓝桥杯]-蚂蚁感冒

问题描述
  长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[n]; // 初始化蚂蚁序列
		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);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值