蓝桥杯-蚂蚁感冒(容易理解java篇)

蓝桥杯-蚂蚁感冒(容易理解java篇)

问题描述
  长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。

当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

思路:当蚂蚁碰头时,两蚂蚁都会进行调头,所以绳子上的蚂蚁的头朝向是不会发生改变的,所以一定会等着病原体来传染,所以答案就是
病原体左边头朝右的蚂蚁个数+1+病原体右边头朝左的蚂蚁个数

在这里插入图片描述

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //蚂蚁感冒:每个蚂蚁都会互相碰撞,互相*掉头*,则头朝右和头朝左的蚂蚁数量是不会发生改变的,所以这些蚂蚁一定会等着感冒体来碰撞
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int danger = -1;//危险的蚂蚁,判断头的方向
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < n; i++) {//取出剩下的蚂蚁
            if (i == 0) {
                danger = scanner.nextInt();
                arrayList.add(danger);
            } else
                arrayList.add(scanner.nextInt());
        }
        Collections.sort(arrayList, new Comparator<Integer>() {//从小到大排序
            @Override
            public int compare(Integer o1, Integer o2) {
                return Math.abs(o1) - Math.abs(o2);
            }
        });


        int leftCount = 0;//头朝左在病原体之后的蚂蚁个数
        int rightCount = 0;//头朝右在病原体之前的蚂蚁个数
        boolean b = false;//判断是否到了病原体的左边,才好给leftCount计数
        for (int i = 0; i < arrayList.size(); i++) {
            int m = arrayList.get(i);
            if (m == danger) {//病原体不能计算在里面
                b = true;
                continue;
            }
            if (b) {
                if (m < 0)
                    leftCount++;
            } else {
                if (m > 0)
                    rightCount++;
            }

        }
        //先判断下左边是否有往右走的蚂蚁->>,如果没有,那感冒个数就只有病原体一个了
        if (danger < 0) {//说明病原体头往左
            if (leftCount == 0) {
                System.out.println(1);//病原体
            } else
                System.out.println(leftCount + rightCount + 1);
        } else {//往右,同上
            if (rightCount == 0) {
                System.out.println(1);
            } else
                System.out.println(leftCount + rightCount + 1);
        }
    }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值