E-手机App防沉迷系统100p

手机App防沉迷系统

题目描述

智能手机方便了我们的生活,但也占用了我们不少时间。为了合理规划每天使用手机 App 的时间,让我们在正确的时间做正确的事,现在开发一个"手机 App 防沉迷系统"。

系统的基本原理如下:

  1. 在一天的 小时内,可以为每个 App 注册允许使用的时段。
  2. 一个时间段内只能使用一个 App。
  3. 每个 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%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论
有需要的宝子可以订阅专栏哦~
点赞 回复 分享
发布于 11-08 11:07 江苏
JS呢?
点赞 回复 分享
发布于 11-19 18:45 上海

相关推荐

刚刚做了华为Java机考,人是懵的。三道题两小时,每道题都看着不难都有思路结果写完过了测试一提交只有10%通过率,最后只有第一题提到了85%,最后算下来135分过不了150线,我愧对期待值拉满的HR,愧对我自己的复习。。。还是没刷够和基础不足,但至少把题目发这里大伙帮我解决一下这个遗憾吧。(不是,哥们。发现十拿九稳的主思路只能过10%,真得懵吧)第一题100:游客参观总时长问游乐园每天开放多久能招待所有游客。游乐园每一段时间能接受任意个数游客。每一行给一个游客的参观时长[1,5],[1,2],&nbsp;[10,11],输出总时长&nbsp;4+1=5.&nbsp;数值全在10^6以下。(确认输入无误)我一开始想做合并时间段最后算累加,结果Arraylist写下来边界判断什么的瞎闹连测试案例都过不了。三道题都写完之后回来检查,改了方法,求出参观时长的最大值,以它为长度建立空数组,再遍历游客时间插入1.最后数1,数到0就断掉算长度累加。通过率到了85%,但是给的反馈是测试用例运行错误,不是超时,我就只能继续检查下一题去了。(没想到后续检查没救得了我)第二题200:字符串集合求交集(这个是我最懵的,教教)(不需要检查输入)题目意思非常简单,给你输入几个字符串集合,{3(长度)&nbsp;123&nbsp;456&nbsp;789}第一个集合.{&nbsp;2&nbsp;456&nbsp;789}第二个集合。输出每个集合交集最大的集合和长度&nbsp;2&nbsp;2&nbsp;\n&nbsp;1&nbsp;2&nbsp;。字符串完全相等就是交集的元素。就这么简单。&nbsp;我Hashmap存集合的输入顺序,也就是集合的序号,value存的是字符串ArrayList。然后按总输出的值遍历这个输入顺序下标获取那个字符串集合,然后和另一个下标对应的字符串集合遍历。四层遍历求个相等的情况+1,记录最长值和最长集合序号。过了测试例以后提交,10%,还是答案错误不是超时,我人懵了,回来检查的时候也还是懵的。各路大神务必教教我这必须查相等的遍历为什么过了基础例子然后只能过10%的测试。有什么优化办法能既考虑边界值也能简化时长的?第三题300:摘水果也蛮直白的,给你个正方形地图,然后每个格子上是水果的数量,如果不能走就是-1.&nbsp;果农要从左上角走到右下角,只能向下或向右。走到右下角以后他再从右下角折回来走(没限制怎么走回来)到左上角,问你他能采摘的最大水果数量。这题我承认肯定是算法没想明白,漏了什么很关键的东西。(应该早点放弃检查的,很烦)这题我一开始想搞个递归往下找记录总数改变地图数字,然后往上找再递归找路最后加起来。但是写出来了向下找路然后发现这个找路和求最大值的路想做复原太诡异了,(现在想想完全可以找到路了记下来再找到最大值,很有可能能避免一些case)就放弃了递归投向动态规划。我累加了一次dp所有值抵达右下角以后,发现这个格子里的值正好是走下去走上来能拿到的最大值,想了一下应该也对,如果从左上角走不下来,那也不可能从那条路折回来,所有通路值加到最后应该就是答案。(难道说!是多个通路,只能取2条最大?!状态转移没这么简单才对!)状态转移方程就是等于非-1的左侧和上侧的格子的值相加再加上本来格子里的值。如果左上都是-1那我直接设为0.(难道该设为-1?复盘才发现槽点太多)(给地图加了一行一列全设为0,从1开始遍历到n。)往回走也不可能走这里。最后得分10%。求解!
牛客141057821号:我用python做的 第一道题记得leetcode有原题,先用开始参观时间sort一下然后指针遍历求set union 第二道题我python暴力解法全过。。 第三道题我是两遍dp,已从从左上到右下一次右下到左上,中间把第一次遍历走过的格子设成0就完了。 话说150是分数线吗?可以问下哪里的消息么
查看3道真题和解析 投递华为等公司10个岗位
点赞 评论 收藏
分享
1 2 评论
分享
牛客网
牛客企业服务