华为机考真题 -- 手机App防沉迷系统

题目描述:
智能手机方便了我们生活的同时,也侵占了我们不少的时间。“手机App防沉迷系统”能够让我们每天合理地规划手机App使用时间,在正确的时间做正确的事。

它的大概原理是这样的:

1. 在一天24小时内,可以注册每个App的允许使用时段;

2. 一个时间段只能使用一个App;
3 .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

数据说明如下:
1. N行注册数据以空格分隔,四项数依次表示:App名称、优先级、起始时间、结束时间
2. 优先级1~5,数字越大,优先级越高
3. 时间格式 HH:MM,小时和分钟都是两位,不足两位前面补0
4. 起始时间需小于结束时间,否则注册不上
5. 注册信息中的时间段包含起始时间点,不包含结束时间点

输出描述:
输出一个字符串,表示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的优先级比App1高,注册App2后,系统将App1的注册信息自动注销后,09:20时刻可用应用名是App2.

示例3:
输入
2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:50

输出
NA

说明:App1被注销后,09:50时刻没有应用注册,因此输出NA

题解

如何处理这些时间段呢?需要将每个时间点转换为分钟数,方便比较。比如,时间09:30可以转换为9*60+30=570分钟,转换start_time和end_time为分钟数,得到s和e

如何判断两个时间段覆盖?如果s1 < e2 and s2 < e1为真,则时间段覆盖

具体步骤:

对于每个新App:

1. 检查start_time < end_time.

时间格式是HH:MM,转换为分钟数。例如,09:00 → 9*60=540.

s = start_time转换后的分钟数.

e = end_time转换后的分钟数.

如果 s >=e,跳过.

2. 遍历现有有效时段列表,检查是否有任何时段的priority >=当前App的priority,并且与新App的时段[s, e)有重叠.

如果存在这样的时段,注册失败.

否则:

注册成功.

a. 遍历现有有效时段列表,找出所有与新App的时段重叠且priority <当前App的priority的时段。将这些时段从列表中删除.

b. 将当前App的时段添加到列表中.

def time2mins(strtime):
    hour, mins = map(int, strtime.split(':'))
    return hour * 60 + mins


def overlap_detect(s1, e1, s2, e2):
    return s1 < e2 and s2 < e1


n = int(input())
intervals = []

for _ in range(n):
    line = input().strip()
    parts = line.split()
    name = parts[0]
    priority = int(parts[1])
    start_time = parts[2]
    end_time = parts[3]
    s = time2mins(start_time)
    e = time2mins(end_time)
    if s >= e:
        continue  # 时间段无效,跳过

    # 检查是否有更高或相同优先级的冲突
    has_conflict = False
    for interval in intervals:
        if (interval['priority'] >= priority) and overlap_detect(interval['start'], interval['end'], s, e):
            has_conflict = True
            break
    if has_conflict:
        continue  # 存在冲突且优先级不高于现有,跳过注册

    # 删除低优先级的冲突区间
    to_remove = []
    for interval in intervals:
        if interval['priority'] < priority and overlap_detect(interval['start'], interval['end'], s, e):
            to_remove.append(interval)
    for interval in to_remove:
        intervals.remove(interval)

    intervals.append({'start': s, 'end': e, 'priority': priority, 'name': name})

# 输入查询时间
query = input().strip()
time = time2mins(query)

ans = "NA"
for interval in intervals:
    if interval['start'] <= time < interval['end']:
        ans = interval['name']
        break  # 找到第一个匹配的 App

print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值