观看文艺汇演-华为OD

本文介绍了一个编程问题,目标是帮助文艺爱好者小明在给定的演出时间表中,考虑到15分钟的间隔,计算他最多可以观看多少场演出。作者提供了Java代码示例和测试用例。
摘要由CSDN通过智能技术生成

观看文艺汇演


前言

本人最近再练习算法,所以会发布一些解题思路,希望大家多指教

一、题目描述?

某公园将举行多场文艺表演,很多演出都是同时进行,一个人只能同时观看一场演出,且不能迟到早退,由于演出分布在不同的演出场地,所以连续观看的演出最少有 15 分钟的时间间隔,小明是一个狂热的文艺迷,想观看尽可能多的演出。现给出演出时间表,请帮小明计算他最多能观看几场演出。

二、输入描述

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

接下来 N 行,每行两个空格分割的整数,第一个整数 T 表示演出的开始时间,第二个整数 L 表示演出的结束时间,T 和 L 的单位为分钟,0 <= T <= 1440, 0 < L <= 100。

三、输出描述

最多能观看的演出场数

四、java代码

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //获取演出场次
        int N = Integer.parseInt(scanner.nextLine());
        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            String[] line = scanner.nextLine().split(" ");
            //获取演出开始时间
            int startTime = Integer.parseInt(line[0]);
            //获取演出持续时间
            int L = Integer.parseInt(line[1]);
            //演出结束时间
            int endTime = startTime + L;
            //存入演出开始时间和演出结束时间(包含15分钟间隔)
            list.add(new int[]{startTime, endTime + 15});
        }
        //按照开始时间正序排序,开始时间相同,则按照结束时间正序排序
        Collections.sort(list,(o1,o2)->{
            if(o1[0] == o2[0]){
                return o1[1] - o2[1];
            } else {
                return o1[0] - o2[0];
            }
        });
        /** 最多场次的选择,可分为以下三种情况 
         * 1. 【当前场次的开始时间】 大于等于 【上个场次的结束时间】,则观看次数++
         * 2. 【当前场次的开始时间】 小于 【上个场次的结束时间】,则跳过 
         * 3. 【当前场次的结束时间】 小于 【上个场次的结束时间】,则舍弃上个场次,选择当前场次观看,结束时间越早,则可观看的场次越多。
         */
        //获取第一个场次的结束时间
        int endTime = list.get(0)[1];
        //初始化可观看场次,最少满足一场
        int time = 1;
        for (int i = 1; i < list.size(); i++) {
            //获取当前场次 开始时间 和 结束时间
            int[] ints = list.get(i);
            int curStartTime = ints[0];
            int curEndTime = ints[1];
            //【当前场次的开始时间】 大于等于 【上个场次的结束时间】,则观看次数++
            if (curStartTime >= endTime) {
                time++;
                endTime = curEndTime;
            }
            //【当前场次的结束时间】 小于 【上个场次的结束时间】,则舍弃上个场次,选择当前场次观看
            if (curEndTime < endTime){
                endTime = curEndTime;
            }
        }
        System.out.println(time);
    }

五、测试用例

输入:
5
100 120
110 50
175 35
220 50
230 45
输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值