手机App防沉迷系统 - 华为OD统一考试(C卷)

题目描述

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

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

2、一个时间段只能使用一个APP, 不能在同时注册App2 和 App3;

3、App有优先级,数值越高,优先级越高。注册使用时段时,如果高优先级的App时间和低优先级的时段有冲突,则系统会自动注销低优先级的时段;

如果App的优先级相同,则后添加的App不能注册。

请编程实现,根据输入数据注册App,并根据输入的时间点,返回时间点注册的App名称,如果该时间点没有注册任何App,请返回字符串“NA"。

输入描述

第一行表示注册的App数N (N≤100)(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优先级高,注册App2之后,App1自动注销,因此输出App2

示例3

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

输出:
NA
package odTest;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

class App{
	private String name;
	private int priority;
	private Date startTime;
	private Date endTime;
	public App() {
	}
	public App(String name, int priority, Date startTime, Date endTime) {
		super();
		this.name = name;
		this.priority = priority;
		this.startTime = startTime;
		this.endTime = endTime;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPriority() {
		return priority;
	}
	public void setPriority(int priority) {
		this.priority = priority;
	}
	public Date getStartTime() {
		return startTime;
	}
	public void setStartTime(Date startTime) {
		this.startTime = startTime;
	}
	public Date getEndTime() {
		return endTime;
	}
	public void setEndTime(Date endTime) {
		this.endTime = endTime;
	}
	
	
}

public class phoneApp {
	public static void main(String[] args) throws ParseException {
		Scanner scanner = new Scanner(System.in);
		int num = Integer.parseInt(scanner.nextLine());
		List<App> appList = new ArrayList<>();
		SimpleDateFormat formate = new SimpleDateFormat("HH:mm");
		for(int i=0;i<num;i++) {
			App app = new App();
			String[] appContent =  scanner.nextLine().split(" ");
			app.setName(appContent[0]);
			app.setPriority(Integer.parseInt(appContent[1]));
			app.setStartTime(formate.parse(appContent[2]));
			app.setEndTime(formate.parse(appContent[3]));
			appList.add(app);
		}
		//自己先筛一遍,将时间重合的App筛掉
		appList=selectPriorApp(appList);
		
		Date objectTime = formate.parse(scanner.nextLine());
		int maxlevel = 0;
		for(App a:appList) {
			if(a.getStartTime().compareTo(objectTime)<=0&&a.getEndTime().compareTo(objectTime)>=0) {
					System.out.println(a.getName());
					break;
			}
			maxlevel++;
		}
		if(maxlevel==appList.size()) {
			System.out.println("NA");
		}
		
	}

	private static List<App> selectPriorApp(List<App> apps) {
		List<App> appList = new ArrayList<>();
		App app = new App();
		for(int i=0;i<apps.size();i++) {
			app = apps.get(i);
			for(int j=i+1;j<apps.size();j++) {
				Date limitStartTime = apps.get(i).getStartTime();
				Date limitEndTime = apps.get(i).getEndTime();
				Date StartTime = apps.get(j).getStartTime();
				Date EndTime = apps.get(j).getEndTime();
				//只要在这范围内,就需要考虑优先级
				if((limitStartTime.compareTo(StartTime)<=0 && limitEndTime.compareTo(StartTime)>=0)||
						(limitStartTime.compareTo(EndTime)<=0 && limitEndTime.compareTo(EndTime)>=0)) {
					if(apps.get(i).getPriority()>apps.get(j).getPriority()) {
						continue;
					}else {
						app = apps.get(j);
					}
				}
			}
			appList.add(app);
		}
		return appList;
	}

}

 

<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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值