历届真题 蚂蚁感冒

  历届试题 蚂蚁感冒  
时间限制: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



第一次的解法(得了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;//蚂蚁是否感冒
}
第二次的解法:

第三组测试数据非常麻烦,
既需要判断掉头之后是否继续掉头,还要规定重合和相遇的先后问题。

推荐此题解法博文:点击打开链接,解法很巧妙;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值