华为OD机试(C卷+D卷)2024真题目录(Java & c++ & python)
题目描述
智能手机方便了我们生活的同时,也侵占了我们不少的时间。“手机App防沉迷系统”能够让我们每天合理地规划手机App使用时间,在正确的时间做正确的事。
它的大概原理是这样的:
- 在一天24小时内,可以注册每个App的允许使用时段
- 一个时间段只能使用一个App
- App有优先级,数值越高,优先级越高。注册使用时段时,如果高优先级的App时间和低优先级的时段有冲突,则系统会自动注销低优先级的时段,如果App的优先级相同,则后添加的App不能注册。
请编程实现,根据输入数据注册App,并根据输入的时间点,返回时间点使用的App名称,如果该时间点没有注册任何App,请返回字符串“NA”。
输入描述
第一行表示注册的App数量 N(N ≤ 100)
第二部分包括 N 行,每行表示一条App注册数据
最后一行输入一个时间点,程序即返回该时间点使用的App
2
App1 1 09:00 10:00
App2 2 11:00 11:30
09:30
数据说明如下:
- N行注册数据以空格分隔,四项数依次表示:App名称、优先级、起始时间、结束时间
- 优先级1~5,数字越大,优先级越高
- 时间格式 HH:MM,小时和分钟都是两位,不足两位前面补0
- 起始时间需小于结束时间,否则注册不上
- 注册信息中的时间段包含起始时间点,不包含结束时间点
输出描述
输出一个字符串,表示App名称,或NA表示空闲时间
用例1
输入
1
App1 1 09:00 10:00
09:30
输出
App1
说明
App1注册在9点到10点间,9点半可用的应用名是App1
用例2
输入
2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:20
输出
App2
说明
ApP1和App2的时段有冲突,App2优先级高,注册App2之后,App1自动注销,因此输出App2。
用例3
输入
2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:50
输出
NA
说明: App1被注销后,09:50时刻没有应用注册,因此输出NA
解题思路
提前将输入的App按照优先级降序(对于优先级相同的App,保持输入顺序,即稳定排序),此时我们会先注册高优先级的App,这样的话,后注册的App只要和前面注册的App发生冲突,则必然无法注册,因为前面已注册App的优先级必然更高。
比如输入的App注册顺序如下
App1 1 09:00 10:00
App2 5 10:10 10:30
App3 3 09:10 10:30
按照优先级降序后,变为了
App2 5 10:10 10:30
App3 3 09:10 10:30
App1 1 09:00 10:00
此时注册结果不变,因为我们可以发现:
- 如果不存在App_low和高优先级App_high有冲突,则高优先级App_high提前注册对结果无影响
- 如果存在App_low和高优先级App_high有冲突,则无论App_high在App_low前面注册,还是在App_low后面注册,结果都是App_low无法注册
参考代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class App {
String name;
int priority;
int startTime;
int endTime;
public App(String name, int priority, int startTime, int endTime) {
this.name = name;
this.priority = priority;
this.startTime = startTime;
this.endTime = endTime;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<App> apps = new ArrayList<>();
for (int i = 0; i < n; i++) {
apps.add(new App(sc.next(), sc.nextInt(), convert(sc.next()), convert(sc.next())));
}
int queryTime = convert(sc.next());
sc.close();
System.out.println(findRegisteredApp(apps, queryTime));
}
public static String findRegisteredApp(List<App> apps, int queryTime) {
List<App> registeredApps = new ArrayList<>();
apps.sort((a, b) -> Integer.compare(b.priority, a.priority));
for (App app : apps) {
if (app.startTime >= app.endTime) continue;
boolean conflict = false;
for (App registered : registeredApps) {
if (hasConflict(app, registered)) {
conflict = true;
break;
}
}
if (!conflict) {
registeredApps.add(app);
}
}
for (App app : registeredApps) {
if (queryTime >= app.startTime && queryTime < app.endTime) {
return app.name;
}
}
return "NA";
}
public static int convert(String time) {
String[] parts = time.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
return hours * 60 + minutes;
}
private static boolean hasConflict(App app1, App app2) {
return (app1.startTime < app2.endTime && app1.endTime > app2.startTime);
}
}