为庆祝中国共产党成立100周年,某公园将举行多场文艺汇演,很多演出都是同时进行。
一个人只能同时观看一场演出,且不能迟到早退。由于演出分散在不同的演出场地,所以连续观看的演出最少要有15分钟的时间间隔。
小明是一个狂热的文艺迷,想观看尽可能多的演出。
现给出演出时间表,请帮助小明计算他最多能观看几场演出。
第一行为一个数N,表示演出场数,1 <= N <= 1000。
接下来的N行,每行两个空格分割的整数,第一个整数T,表示演出开始时间,第二个整数L,表示演出持续时间。
T和L的单位都是分钟,1 <= T <= 1440、1 <= L <= 180。
请输出最多能观看的演出场数。
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);
}
8
10 20
10 30
40 20
45 20
45 30
75 10
80 10
80 20
3
输入的时候,为了方便,我就“按照开始时间排序,如果开始时间相同,再安装结束时间排序。”来输入。
下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路
本文收录于,华为OD机试(JAVA)(2022&2023)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。