问题重述:
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式:
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数 据代表的蚂蚁感冒了。
输出格式:
要求输出1个整数,表示最后感冒蚂蚁的数目。样例输入:
35 -2 8
样例输出:
1样例输入:
5-10 8 -20 12 25
样例输出:
3
在老赵的提醒下,首先相向而行的蚂蚁碰面后掉头可以看成是直接擦肩而过继续保持方向向前;对于蚂蚁有如下几种情况:
1.和感冒蚂蚁方向相反的两种情况:
(1)与感冒蚂蚁背道而驰,这类蚂蚁绝对不会被传染;
(2)与感冒蚂蚁相向而行,这类蚂蚁必然被传染;
2.和感冒蚂蚁同方向的两种情况:
(1)在感冒蚂蚁的前面,这类蚂蚁也不会被传染,因为所有蚂蚁等速,感冒蚂蚁追不上在其前方的蚂蚁;
(2)在感冒蚂蚁后面,首先这类蚂蚁又有两种可能,
a)如果存在1中的(2)那一类蚂蚁,则感冒蚂蚁先传染相向而来的蚂蚁,被传染的蚂蚁又传染第一只感冒蚂蚁后面的蚂蚁;
b)如果不存在上述情况,感冒蚂蚁后面的蚂蚁也不会被传染;
据此得到程序如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String []arg){
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
int n=cin.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++)
a[i]=cin.nextInt();
boolean flag=false;
int sum=1;
for(int i=1;i<a.length;i++){
if((Math.abs(a[i])-Math.abs(a[0]))*a[0]>0 && a[0]*a[i]<0){
sum++;
flag=true;
}
}
if(flag){
for(int i=1;i<a.length;i++){
if((Math.abs(a[0])-Math.abs(a[i]))*a[i]>0 && a[0]*a[i]>0)
sum++;
}
}
System.out.println(sum);
}
cin.close();
}
}