历届试题 蚂蚁感冒

来源:互联网 发布:excel数据筛选 编辑:程序博客网 时间:2024/05/15 23:43
/*历届试题 蚂蚁感冒   时间限制:1.0s   内存限制:256.0MB 问题描述 长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*/import java.util.*;public class AntCold {public static void main(String args[]) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] a = new int[n + 1];int[] b = new int[n + 1];for (int i = 1; i < a.length; i++) {a[i] = sc.nextInt();b[i] = a[i] < 0 ? 0 : 1;}sc.close();int k = a[1] < 0 ? 0 : 1;int x = 0, y = 0, p = 0, t = 0;for (int i = 2; i <= n; i++) {// 感冒蚁向右走,蚂蚁i向左走,并且蚂蚁i在感冒蚁的右边,这样才有可能相遇--条件Aif (Math.abs(a[1]) < Math.abs(a[i]) && a[1] > 0 && b[i] == 0)x++;// 感冒蚁向左走,蚂蚁i向右走,并且蚂蚁i在感冒蚁的左边,这样才有可能相遇--条件Bif (Math.abs(a[1]) > Math.abs(a[i]) && a[1] < 0 && b[i] == 1)y++;/* * 10 50 1 2 3 4 5 6 7 8 -59 这里千万要注意了,此时的表现呢 * 假设蚂蚁i都没有动,感冒蚁一直往右走(冲到自己的位置),凡是比感冒蚁绝对值要小的,都会被感冒蚁感染 * 相当于,当条件A满足了,那么这个条件就满足了 * 因为条件A满足,意味着感冒蚁已经到了与某只蚂蚁碰面了,比如上面的例子,50与-59碰面了,50调头 * 调头后,就将前面的1-8都感染了--条件C的作用,算不算数,得看条件A满不满足 */if (Math.abs(a[1]) > Math.abs(a[i]) && a[1] > 0 && b[i] == 1)p++;if (Math.abs(a[1]) < Math.abs(a[i]) && a[1] < 0 && b[i] == 0)t++;}//一开始,病蚁是向右走的if (k == 1) {if (x != 0)System.out.println(x + p + 1);elseSystem.out.println(1);} else {if (y != 0)System.out.println(y + t + 1);elseSystem.out.println(1);}}}

0 0
原创粉丝点击