观看文艺汇演
前言
本人最近再练习算法,所以会发布一些解题思路,希望大家多指教
一、题目描述?
某公园将举行多场文艺表演,很多演出都是同时进行,一个人只能同时观看一场演出,且不能迟到早退,由于演出分布在不同的演出场地,所以连续观看的演出最少有 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
输出: