华为OD E卷(100分)12-APP 防沉迷系统

前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

        智能手机在方便我们生活的同时,也侵占了大量时间。手机App防沉迷系统旨在帮助用户合理规划手机App使用时间,确保在正确的时间做正确的事。

        系统的主要功能包括:

  1. 在一天24小时内,可注册每个App的允许使用时段。
  2. 一个时段只能使用一个App,即不能同时注册多个App在同一时间段内使用。
  3. App有优先级,数值越高,优先级越高。
  4. 注册时,如果高优先级的App时间和低优先级的时段有冲突,系统会自动注销低优先级的时段;
  5. 如果App的优先级相同,则后添加的App不能注册。

        编程实现

  1. 编程实现时,需要处理输入数据,包括App的数量、每个App的注册信息(名称、优先级、起始时间、结束时间),
  2. 并根据输入的时间点返回该时间点可用的App名称。如果时间点没有注册任何App,则返回“NA”。

示例

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

输出结果
App2

解题思路

  1. 将 APP名称作为key, 优先级和时间段形成数组作为Value (【优先级,起始时间,结束时间】)存入map中。
  2. 时间段转化为int值。
  3. 将给定时间转为int值并查找是否在允许范围内,并记录最大优先级, 优先级最大的Key即为即为输出结果。

题解

java实现

package huawei.e100;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
* @author arnold
* @date 2024年12月10日
* 
*/
public class T12 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Map<String, Integer[]> apps = new HashMap<>();
		while(sc.hasNext()) {
			String str = sc.nextLine();
			String[] tmp = str.split(" ");
			if (tmp.length == 1) {
				String app = find(apps, str);
				System.out.println(app);
				apps = new HashMap<>();
			} else {
				Integer[] data = new Integer[3];
				data[0] = Integer.parseInt(tmp[1]);
				data[1]	 = toSeconds(tmp[2]);
				data[2] = toSeconds(tmp[3]);
				apps.put(tmp[0], data);
			}
		}
		

	}
	private static int toSeconds(String time) {
		String[] tmp = time.split(":") ;
		int h = Integer.parseInt(tmp[0]);
		int m = Integer.parseInt(tmp[1]);
		return h*3600 + m*60;
	}
	private static String find(Map<String, Integer[]> apps, String time) {
		String res = "NA";
		int maxLevel = 0;
		int timeSeconds = toSeconds(time);
		Set<String> appNames = apps.keySet();
		for(String s :appNames) {
			if(apps.get(s)[1] <= timeSeconds && apps.get(s)[2] >= timeSeconds ) {
				maxLevel = Math.max(maxLevel, apps.get(s)[0]);
				if (maxLevel ==  apps.get(s)[0]) {
					res = s;
				}
			}
		}
		return res;
	}

}
内容概要:本文系统探讨了CUDA并行计算优化技巧在计算机竞赛中的实战应用,重点解决暴力枚举在大规模数据下超时的问题。通过将独立的解空间验证任务配给GPU海量线程并发执行,显著提升计算效率。文章围绕图论(全源最短路径Floyd-Warshall算法)和数值计算(多初始值牛顿迭代求解非线性方程)两大高频竞赛场景,详细剖析了线程索引映射、原子操作、常量内存、流并发等核心优化技术,并提供了串行与并行代码对比及性能析。结果显示,在A100和RTX 3090等GPU上,加速比可达72至150倍,实现从钟级到秒级甚至毫秒级的性能突破。此外,文章展望了动态并行、多GPU协同、AI辅助调优等未来趋势,强调CUDA优化对培养软硬件协同思维的重要意义。; 适合人群:具备一定C/C++编程基础和算法竞赛经验,熟悉基本图论与数值计算问题,希望提升高性能计算能力的高校学生或竞赛选手(尤其是参与ACM、ICPC、NOI等赛事的1-3年备赛者); 使用场景及目标:①掌握如何将传统暴力枚举算法转化为GPU并行版本;②深入理解Floyd-Warshall和牛顿迭代等经典算法的并行化限制与优化策略;③学习CUDA内存模型、线程组织与同步机制在实际问题中的应用; 阅读建议:建议结合文中代码案例在支持CUDA的环境上动手实现并调试,重点关注线程映射、内存访问模式与数据依赖处理,同时对比串行与并行版本的运行效率,深化对并行计算本质的理解。
<think>好的,我需要帮用户了解如何开发华为OD手机App防沉迷系统的实现方案。首先,我得仔细析用户提供的引用内容,看看里面有哪些关键点。 根据引用[2],系统的主要功能包括在24小时内注册每个App的允许使用时段,每个时段只能使用一个App。优先级高的App会覆盖低优先级的冲突时段,同优先级则后添加的无法注册。用例2的例子也说明了冲突处理逻辑。 接下来,我需要确定系统的核心模块。用户提到的注册App、冲突检测和处理、时间管理应该是关键部。然后考虑数据结构,引用[4]提到使用列表存储App信息,可能需要按优先级排序,并结合时间区间来处理冲突。 技术选型方面,后端可以用Java或Python,前端可能需要一个简单的界面。算法部,引用[3]中的例子使用了优先级比较和时间段冲突检查,这里可能需要贪心算法,按优先级和时间排序后处理。 具体实现步骤可能需要先读取输入数据,解析时间格式,然后处理冲突。比如,每次添加新App时,检查已有时间段是否有冲突,根据优先级决定是否覆盖或拒绝。时间管理需要将时间段转换为钟数,方便比较。 测试用例部,用户提供的用例2输入两个App,优先级不同,系统应保留高优先级的App2。这验证了冲突处理逻辑。 最后,要考虑扩展功能,比如使用统计和提醒功能,这可能需要定时任务或后台服务来监控App使用情况。 需要确保所有提到的点都涵盖在回答中,结构清晰,步骤说明,并引用相关的引用来源。同时,按照用户的要求生成相关问题,可能涉及系统设计细节、算法优化等。</think>### 华为OD手机App防沉迷系统开发实现方案 #### 一、系统核心需求析 1. **时段注册**:每个App可注册允许使用时段(24小时内),且同一时间段仅允许注册一个App[^2] 2. **冲突处理**:高优先级App自动覆盖低优先级冲突时段,同优先级时段冲突则后注册失败[^3] 3. **时间管理**:精确到钟的时间段管理(如09:00-10:00) #### 二、系统架构设计 ```mermaid graph TD A[输入模块] --> B[数据解析] B --> C[冲突检测引擎] C --> D[优先级处理模块] D --> E[注册表管理] E --> F[输出模块] ``` #### 三、关键技术实现 1. **数据结构设计** ```python class App: def __init__(self, name, priority, start, end): self.name = name # App名称 self.priority = int(priority) # 优先级数值 self.start = self._time_to_minutes(start) # 起始时间转钟数 self.end = self._time_to_minutes(end) # 结束时间转钟数 def _time_to_minutes(self, time_str): h, m = map(int, time_str.split(':')) return h * 60 + m ``` 2. **冲突检测算法** ```python def check_conflict(new_app, existing_apps): for app in existing_apps[::-1]: # 逆序检查便于处理覆盖 if new_app.start < app.end and new_app.end > app.start: if new_app.priority > app.priority: existing_apps.remove(app) elif new_app.priority == app.priority: return False # 同优先级冲突 return True ``` 3. **主处理流程** ```python def register_apps(app_list): registered = [] for app in sorted(app_list, key=lambda x: (-x.priority, x.start)): if check_conflict(app, registered): registered.append(app) return registered ``` #### 四、关键问题解决方案 1. **时间格式处理**:统一转换为钟数进行运算(如09:10→550钟)[^4] 2. **优先级覆盖逻辑**:采用逆序检查+动态更新注册表的方式实现实时覆盖 3. **性能优化**:通过排序(优先级降序,时间升序)将时间复杂度控制在$O(nlogn)$ #### 五、测试用例验证 输入案例(引用[3]): ``` 输入: 2 App1 1 09:00 10:00 App2 2 09:10 09:30 09:20 输出: App2 ``` 处理过程: 1. App2优先级更高,覆盖App1的冲突时段(09:10-09:30) 2. 最终保留App2的注册时段 #### 六、扩展功能建议 1. **使用统计**:记录各App实际使用时长,生成日报(可参考引用[1]的健康管理理念) 2. **提醒功能**:在时段结束前5钟发出提醒 3. **例外处理**:设置紧急突破机制(如家长控制模式)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

arnold66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值