侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 26 条评论

目 录CONTENT

文章目录

【分类讨论】蚂蚁感冒

GabrielxD
2023-02-21 / 0 评论 / 0 点赞 / 209 阅读 / 909 字
温馨提示:
本文最后更新于 2023-02-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1211. 蚂蚁感冒 - AcWing题库


100100 厘米的细长直杆子上有 nn 只蚂蚁。

它们的头有的朝左,有的朝右。

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

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

这些蚂蚁中,有 11 只蚂蚁感冒了。

并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

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

输入格式

第一行输入一个整数 nn , 表示蚂蚁的总数。

接着的一行是 nn 个用空格分开的整数 XiX_i , XiX_i 的绝对值表示蚂蚁离开杆子左边端点的距离。

正值表示头朝右,负值表示头朝左,数据中不会出现 00 值,也不会出现两只蚂蚁占用同一位置。

其中,第一个数据代表的蚂蚁感冒了。

输出格式

输出1个整数,表示最后感冒蚂蚁的数目。

数据范围

1<n<501 < n < 50 ,
0<Xi<1000 < |X_i| < 100

输入样例1:

3
5 -2 8

输出样例1:

1

输入样例2:

5
-10 8 -20 12 25

输出样例2:

3

解题

方法一:分类讨论

思路

分类讨论:

  • 如果第一个蚂蚁向右走:

    • 在第一个蚂蚁右边的蚂蚁:

      • 向左走的必被感染
      • 向右走的必不被感染
    • 在第一个蚂蚁左边的蚂蚁:

      • 向左走的必不被感染
      • 向右走的:
        • 在第一个蚂蚁右边存在向左走的蚂蚁的情况下,必被感染
        • 否则必不被感染
  • 如果第一个蚂蚁向左走:

    • 在第一个蚂蚁左边的蚂蚁:

      • 向右走的必被感染
      • 向左走的必不被感染
    • 在第一个蚂蚁右边的蚂蚁:

      • 向右走的必不被感染
      • 向左走的:
        • 在第一个蚂蚁左边存在向右走的蚂蚁的情况下,必被感染
        • 否则必不被感染

代码

两边分开两次循环计:

import java.util.*;
import java.io.*;

public class Main {
    static int N = 110;
    
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        int n = (int) in.nval;
        in.nextToken();
        int x0 = (int) in.nval;
        int dir = x0 < 0 ? -1 : 1;
        x0 = Math.abs(x0);
        int[] a = new int[N];
        while (--n > 0) {
            in.nextToken();
            int x = (int) in.nval;
            a[Math.abs(x)] = x < 0 ? -1 : 1;
        }
        boolean flag = false;
        int cnt = 1;
        for (int i = x0; i > 0 && i < N; i += dir) {
            if (a[i] != 0 && a[i] != dir) {
                ++cnt;
                flag = true;
            }
        }
        if (flag) {
            for (int i = x0; i > 0 && i < N; i -= dir) {
                if (a[i] != 0 && a[i] == dir) ++cnt;
            }
        }
        System.out.println(cnt);
    }
}

两边在一次循环里计:

import java.util.*;
import java.io.*;

public class Main {
    static int N = 110;
    
    public static void main(String[] args) throws IOException {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        in.nextToken();
        int n = (int) in.nval;
        in.nextToken();
        int x0 = (int) in.nval;
        int dir = x0 < 0 ? -1 : 1;
        x0 = Math.abs(x0);
        int[] a = new int[N];
        while (--n > 0) {
            in.nextToken();
            int x = (int) in.nval;
            a[Math.abs(x)] = x < 0 ? -1 : 1;
        }
        boolean flag = false;
        int cnt = 1;
        for (int x = dir > 0 ? 99 : 1; x > 0 && x < N; x -= dir) {
            if (a[x] == 0) continue;
            if (x > x0 == dir > 0 && a[x] != dir) {
                ++cnt;
                flag = true;
            }
            if (x > x0 != dir > 0 && flag && a[x] == dir) ++cnt;
        }
        System.out.println(cnt);
    }
}
0

评论区