历届试题 蚂蚁感冒
时间限制:1.0s 内存限制:256.0MB
问题描述
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出格式
要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
3
5 -2 8
5 -2 8
样例输出
1
样例输入
5
-10 8 -20 12 25
-10 8 -20 12 25
样例输出
3
第一次的解法(得了75分,第三组测试数据没过,原因是掉头之后还有可能再次掉头):
package 真题;
import java.util.Scanner;
public class 蚂蚁感冒 {
public static void main(String[] args) {
MYGM mayi = new MYGM();
}
}
class MYGM{
int n;
Ant[] ants;
int result = 0;
public MYGM(){
Scanner sca = new Scanner(System.in);
n = sca.nextInt();
ants = new Ant[n];
for(int i=0;i<n;i++){
ants[i] = new Ant();
ants[i].position = sca.nextInt();
}
ants[0].isGanmao = true;
int num = n;//杆子上的蚂蚁数量
while(num>0){
for(int i=0;i<n;i++){//碰头判断
for(int j=i+1;j<n;j++){//j从i+1开始,避免重复判断
if(ants[i].isIn==true&&ants[j].isIn==true){
int one = ants[i].position;
int two = ants[j].position;
if(one+two==0||one+two==-1){//重合或者相邻相对
ants[i].position = 0-ants[i].position;
ants[j].position = 0-ants[j].position;//掉头
if(ants[i].isGanmao==true||ants[j].isGanmao==true){//有一个感冒了
ants[i].isGanmao=true;
ants[j].isGanmao=true;
}
}
}
}
}
for(int i=0;i<n;i++){//前进操作
if(ants[i].isIn){
ants[i].position++;//不管是负的还是正的都++;
if(ants[i].position==0||ants[i].position>100){//将走出去的蚂蚁去除
ants[i].isIn = false;
num --;
}
}
}
}
for(int i=0;i<n;i++){
if(ants[i].isGanmao){
result++;
}
}
System.out.println(result);
}
}
class Ant{//蚂蚁类
boolean isIn=true;//蚂蚁是否还在长杆上
int position;//蚂蚁的位置以及方向
boolean isGanmao=false;//蚂蚁是否感冒
}
第二次的解法:
第三组测试数据非常麻烦,
既需要判断掉头之后是否继续掉头,还要规定重合和相遇的先后问题。
推荐此题解法博文:点击打开链接,解法很巧妙;