华为OD机考双机位C卷 - 手机App防沉迷系统 (Java & Python & JS & GO & C++ & C)
手机App防沉迷系统
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
智能手机方便了我们生活的同时,也侵占了我们不少的时间。“手机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
说明
解题思路
本题的核心是带优先级的区间调度问题。我们需要管理一组时间段,确保在任意时刻只有一个 App 处于活跃状态,且遵循“高优先级抢占,同/低优先级被拒”的原则。
1. 时间处理
为了方便计算和比较,首先将所有的时间点(HH:MM)转换为以“分钟”为单位的整数(例如 09:00 -> 540)。这样区间的比较就变成了简单的整数比较。
2. 注册与冲突解决
我们需要维护一个“已注册 App 列表”。对于每一个试图注册的新 App:
- 冲突检测:遍历当前已注册的所有 App,判断新 App 的时间段是否与它们有重叠。重叠的条件是:
max(新开始, 旧开始) < min(新结束, 旧结束)。 - 优先级比较:
- 如果新 App 优先级 > 旧 App 优先级:说明新 App 应当抢占该时间段,因此将旧 App 注销(从已注册列表中移除)。
- 如果新 App 优先级 ≤ 旧 App 优先级:说明新 App 无法抢占,旧 App 保留。
- 添加策略:
- 经过上述冲突处理(可能移除了一些低优先级的旧 App)后,将新 App 加入已注册列表。
- 注:在某些代码实现中,即使新 App 优先级较低且有冲突,可能也会被加入列表。但由于列表通常保持了添加顺序或特定顺序,且查询时只要找到第一个匹配项就返回,因此存在的“高优先级”旧 App 会自然地屏蔽掉“低优先级”新 App 的查询结果,从而达成题目要求。
3. 查询结果
针对给定的查询时间点:
- 遍历最终的已注册 App 列表。
- 检查该时间点是否落在某个 App 的
[开始时间, 结束时间)区间内。 - 由于题目保证了(或通过逻辑实现了)同一时刻的高优先级覆盖,找到的第一个匹配项即为结果。
- 如果没有匹配项,输出 "NA"。
浙公网安备 33010602011771号