华为OD机试真题 Java 实现【观看文艺汇演问题】【2023 B卷 100分】,附详细解题思路

在这里插入图片描述

一、题目描述

为庆祝中国共产党成立100周年,某公园将举行多场文艺汇演,很多演出都是同时进行。

一个人只能同时观看一场演出,且不能迟到早退。由于演出分散在不同的演出场地,所以连续观看的演出最少要有15分钟的时间间隔。

小明是一个狂热的文艺迷,想观看尽可能多的演出。

现给出演出时间表,请帮助小明计算他最多能观看几场演出。

二、输入描述

第一行为一个数N,表示演出场数,1 <= N <= 1000。

接下来的N行,每行两个空格分割的整数,第一个整数T,表示演出开始时间,第二个整数L,表示演出持续时间。

T和L的单位都是分钟,1 <= T <= 1440、1 <= L <= 180。

三、输出描述

请输出最多能观看的演出场数。

四、解题思路

  1. 将输入的每一行的开始时间和持续时间,改造为开始时间+结束时间,添加到集合timeList中,方便比较;
  2. 对timeList按照开始时间排序;
  3. 如果开始时间相同,则按结束时间排序,这样可以尽可能的看更多的场次;
  4. 定义一个变量能观看的演出数sum;
  5. 顺序第一的第一场演出是必看的,然后从第二场演出开始遍历;
  6. 比较当前演出的开始时间和上一场的结束时间,看是否大于15;
  7. 如果大于等于15,则可以观看,sum++;
  8. 如果小于15,则无法观看当前场次;
  9. 再用上一场的结束时间,去和下一场的开始时间比较,看是否大于等于15,以此类推;
  10. 输出可以观看的场次sum;

五、Java算法源码

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    // 演出场数
    int n = Integer.valueOf(sc.nextLine());
    // 将输入的每一行的开始时间和持续时间,改造为开始时间+结束时间,方便比较;
    List<Integer[]> timeList = new ArrayList<Integer[]>();
    for (int i = 0; i < n; i++) {
        int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        Integer[] timeArr = new Integer[2];
        // 演出开始时间
        timeArr[0] = nums[0];
        // 演出结束时间
        timeArr[1] = nums[1] + timeArr[0];
        timeList.add(timeArr);
    }

    timeList.sort((a, b) -> {
        if (a[0] == b[0]) {
            // 演出开始时间相等时,结束时间小的在前
            return a[1] - b[1];
        }
        // 演出开始时间小的在前
        return a[0] - b[0];
    });

    // 能观看的演出数
    int sum = 1;

    // 第一个演出的结束时间
    int end = timeList.get(0)[1];
    // 从第二个演出开始遍历
    for (int i = 1; i < timeList.size(); i++) {
        // 当前演出的开始时间
        int begin = timeList.get(i)[0];
        // 当前演出的结束时间
        int right = timeList.get(i)[1];
        if (begin - end >= 15) {
            // 当前演出的开始时间与上场演出的结束时间相差大于等于15
            // 场次+1
            sum++;
            // 更新结束时间
            end = right;
        } else {
            // 下一场演出无法观看时,取上一场的结束时间为end
            end = Math.min(end, right);
        }
    }

    System.out.println(sum);
}

六、效果展示

1、输入

8
10 20
10 30
40 20
45 20
45 30
75 10
80 10
80 20

2、输出

3

3、说明

输入的时候,为了方便,我就“按照开始时间排序,如果开始时间相同,再安装结束时间排序。”来输入。

  1. 第一场开始时间10,结束时间30;
  2. 按照下一场的开始时间 - 上一场的结束时间 大于等于 15的说法,下一场45 20的可看;
  3. 结束时间变为65,再加15,下一场开始时间大于等于80的场次可看,故80 10可看;
  4. 因此,可以看三场演出;

华为OD机试真题 Java 实现【观看文艺汇演问题】【2023 B卷 100分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

本文收录于,华为OD机试(JAVA)(2022&2023)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,java,开发语言,算法,华为)