2023华为OD机试 (B卷)|200分 计算观看演唱会场次( Java JavaScript C++ Python)
题目描述
为了庆祝中国共产党成立100周年,某公园将举行多场文艺表演,很多演出都是同时进行,一个人只能同时观看一场演出,且不能迟到早退,由于演出分布在不同的演出场地,所以连续观看的演出最少有
15
分钟的时间间隔。
小明是一个狂热的文艺迷,想观看尽可能多的演出,现给出演出时间表,请帮小明计算他最多能观看几场演出。
输入描述
第一行为一个数N,表示演出场数,
1 <= N<=1000
,接下来N
行,每行有被空格分割的两个整数,
第一个整数T表示演出的开始时间,第二个整数L
表示演出的持续时间
T
和L
的单位为分钟,0 <=T <=1440, 0 <= L <= 100
输出描述
输出最多能观看的演出场数。
用例
输入 | 2 720 120 840 120 |
---|---|
输出 | 1 |
说明 | 无 |
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<int[]> timeList = new ArrayList<>();
for (int i = 0; i < n; i++) {
int startTime = sc.nextInt();
int duration = sc.nextInt();
int endTime = startTime + duration;
timeList.add(new int[]{startTime, endTime});
}
Collections.sort(timeList, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
if (a[1] == b[1]) {
return b[0] - a[0];
} else {
return b[1] - a[1];
}
}
});
int startTime = timeList.get(0)[0];
int ans = 1;
for (int[] time : timeList) {
int curStartTime = time[0];
int curEndTime = time[1];
if (startTime - curEndTime > 15) {
ans++;
startTime = curStartTime;
}
}
System.out.println(ans);
}
}
Javascript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let n;
let timeList = [];
rl.on('line', (input) => {
if (!n) {
n = parseInt(input);
} else {
const [start, duration] = input.split(' ').map((x) => parseInt(x));
timeList.push([start, start + duration]);
if (timeList.length === n) {
solve();
}
}
});
function solve() {
timeList.sort((a, b) => {
if (a[1] === b[1]) {
return b[0] - a[0];
} else {
return b[1] - a[1];
}
});
let startTime = timeList[0][0];
let ans = 1;
for (let i = 1; i < n; i++) {
const [curStartTime, curEndTime] = timeList[i];
if (startTime - curEndTime > 15) {
ans++;
startTime = curStartTime;
}
}
console.log(ans);
rl.close();
}
C++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>> timeList(n, vector<int>(2));
for (int i = 0; i < n; i++) {
cin >> timeList[i][0]; // 开始时间
timeList[i][1] = timeList[i][0] + (cin >> timeList[i][1], timeList[i][1]); // 结束时间 = 开始时间 + 持续时间
}
sort(timeList.begin(), timeList.end(), [](const vector<int>& a, const vector<int>& b){
return a[1] == b[1] ? b[0] < a[0] : b[1] < a[1]; // 按照演出结束时间从早到晚排序,如果结束时间相同则按照开始时间从晚到早排序
});
int startTime = timeList[0][0]; // 最早开始观看的演出的开始时间
int ans = 1; // 观看的演出场数
for (auto& time : timeList) {
int curStartTime = time[0];
int curEndTime = time[1];
if (startTime - curEndTime > 15) { // 如果最早开始观看的演出和当前演出之间的时间差超过15分钟
ans++; // 可以观看当前演出
startTime = curStartTime; // 更新最早开始观看的演出的开始时间
}
}
cout << ans << endl; // 输出观看的演出场数
return 0;
}
python
import sys
n = None
timeList = []
for line in sys.stdin:
input = line.strip()
if not n:
n = int(input)
else:
start, duration = map(int, input.split())
timeList.append([start, start + duration])
if len(timeList) == n:
break
timeList.sort(key=lambda x: (-x[1], -x[0]))
startTime = timeList[0][0]
ans = 1
for i in range(1, n):
curStartTime, curEndTime = timeList[i]
if startTime - curEndTime > 15:
ans += 1
startTime = curStartTime
print(ans)