E卷-手机App防沉迷系统 100分)
手机App防沉迷系统
题目描述
智能手机方便了我们的生活,但也占用了我们不少时间。为了合理规划每天使用手机 App 的时间,让我们在正确的时间做正确的事,现在开发一个"手机 App 防沉迷系统"。
系统的基本原理如下:
- 在一天的 小时内,可以为每个 App 注册允许使用的时段。
- 一个时间段内只能使用一个 App。
- 每个 App 有一个优先级,用 到 的整数表示,数值越大优先级越高。在注册使用时段时,如果高优先级 App 的时段与低优先级 App 的时段冲突,系统会自动注销低优先级的 App 在冲突时段的使用权限。如果优先级相同,则先注册的 App 保留使用权限,后注册的 App 无法在冲突时段使用。
请你编写一个程序,根据输入的 App 注册信息,以及给定的查询时间点,返回该时间点可以使用的 App 名称。如果该时间点没有可用的 App,则返回字符串 "NA"
。
输入格式
第一行包含一个正整数 (),表示需要注册的 App 数量。
接下来 行,每行包含一个 App 的注册信息,由 App 名称、优先级、起始时间、结束时间组成,四项数据以空格分隔:
- App 名称为仅由大小写英文字母和数字组成的字符串,长度不超过 。
- 优先级为 到 的整数,数字越大优先级越高。
- 起始时间和结束时间的格式为
HH:MM
,保证 ,。起始时间严格小于结束时间。注册的时段包含起始时间点,但不包含结束时间点。
最后一行包含一个查询时间点,格式与起始时间和结束时间相同。
输出格式
输出一个字符串,表示查询时间点可用的 App 名称,或者 "NA"
表示该时间点没有可用的 App。
样例输入
2
App1 1 09:00 10:00
App2 2 11:00 11:30
09:30
样例输出
App1
样例解释
App1 注册了 : 到 : 的时段,查询时间点 : 落在该时段内,因此可以使用 App1。
样例输入
2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:20
样例输出
App2
样例解释
App1 和 App2 注册的时段有冲突,但 App2 的优先级更高,因此 App1 在冲突时段 : 到 : 内的注册无效,查询时间点 : 只能使用 App2。
样例输入
2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:50
样例输出
NA
样例解释
查询时间点 : 不在任何已注册的 App 可用时段内,因此输出 "NA"
。
数据范围
对于 的数据,。 对于 的数据,。 对于 的数据,。
题解
模拟
首先,我们定义一个 App
类来表示每个 App 的注册信息,包括 App 的名称、优先级、起始时间和结束时间。我们可以把时间转换成以分钟为单位的整数,这样比较时间大小会更方便。然后,我们按照输入的顺序依次处理每个 App 的注册信息。对于每个待注册的 App,我们需要判断它的使用时段是否和已经注册的 App 有冲突。如果有冲突,就比较两个 App 的优先级:
- 如果待注册的 App 优先级更高,那么我们就把冲突的 App 从已注册列表中删除,然后把当前的 App 加入到已注册列表中。
- 如果待注册的 App 优先级不高于冲突的 App,那么当前的 App 就不能注册了。
我们可以用一个列表来维护已经注册的 App,每次注册新的 App 时,就遍历这个列表,检查是否有冲突。如果要删除冲突的 App,可以先记录下它们的位置,然后再一次性删除,避免在遍历列表的同时修改列表导致的问题。处理完所有的注册信息后,我们再来处理查询时间点。我们遍历已注册的 App 列表,找到包含查询时间点的 App,输出它的名称即可。如果没有找到,就输出 "NA"
。
参考代码
- Python
class App:
def __init__(self, name, priority, start_time, end_time):
self.name = name
self.priority = priority
self.start_time = self.convert_time(start_time) # 将时间字符串转换为分钟数
self.end_time = self.convert_time(end_time)
@staticmethod
def convert_time(time_str):
"""将时间字符串转换为分钟数"""
hours, minutes = map(int, time_str.split(':'))
return hours * 60 + minutes
def main():
n = int(input()) # 读入 App 数量
apps = []
for _ in range(n):
name, priority, start_time, end_time = input().split()
apps.append(App(name, int(priority), start_time, end_time))
query_time_str = input() # 读入查询时间点
query_time = App.convert_time(query_time_str)
registered_apps = [] # 已注册的 App 列表
for app in apps:
if app.start_time >= app.end_time: # 起始时间大于等于结束时间,不能注册
continue
conflicting_apps = [] # 记录与当前 App 冲突的已注册 App
can_register = True
for registered_app in registered_apps:
if not (registered_app.start_time >= app.end_time or app.start_time >= registered_app.end_time):
# 如果时段冲突,比较优先级
if app.priority > registered_app.priority:
conflicting_apps.append(registered_app)
else:
can_register = False
break
if can_register:
registered_apps = [a for a in registered_apps if a not in conflicting_apps] # 移除冲突的已注册 App
registered_apps.append(app) # 将当前 App 加入已注册列表
# 在已注册的 App 中查找包含查询时间点的 App
result = next((app.name for app in registered_apps if app.start_time <= query_time < app.end_time), "NA")
print(result) # 输出查询结果
if __name__ == '__main__':
main()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_N 100
#define MAX_NAME_LEN 20
typedef struct {
char name[MAX_NAME_LEN + 1];
int priority;
int start_time;
int end_time;
} App;
int convert_time(const char *time_str) {
int hours, minutes;
sscanf(time_str, "%d:%d", &hours, &minutes);
return hours * 60 + minutes;
}
int main() {
int n;
scanf("%d", &n); // 读入 App 数量
App apps[MAX_N];
for (int i = 0; i < n; i++) {
char start_time_str[6], end_time_str[6];
scanf("%s %d %s %s", apps[i].name, &apps[i].priority, start_time_str, end_time_str);
apps[i].start_time = convert_time(start_time_str);
apps[i].end_time = convert_time(end_time_str);
}
char query_time_str[6];
scanf("%s", query_time_str); // 读入查询时间点
int query_time = convert_time(query_time_str);
App *registered_apps[MAX_N];
int num_registered_apps = 0;
for (int i = 0; i < n; i++) {
App *app = &apps[i];
if (app->start_time >= app->end_time) { // 起始时间大于等于结束时间,不能注册
continue;
}
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏收集并整理了一些刷题笔记