Python-算法编程100例-系统设计题(入门级)-疫情人员管理

题目描述:

现有一套用于管理疫情下人员流动风险的软件系统,请实现以下接口:

RiskMonitor(int[] people):系统初始化,people[i]的下标表示人员编号,值表示所在地区的编号。初始时所有地区(包括没人的地区)都为低风险,系统初始为第0天。

travel(int date, int peopleid, int regionid): 在第date天时,人员peopleid前往目的地regionid旅行。

a. 如果该人员已经在该地区regionid,则停留在原地,并返回1;

b. 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回-1;

c. 否则旅行成功,该人员从date天(含)开始位于新地区,返回0。

increaseRisk(int date, int regionid): 第date天(含)时,地区regionid变成高风险。当前该地区人员立即被隔离。

decreaseRisk(int date, int regionid):在第date天(含)时,地区regionid变成低风险。

a. 如果该地区从date开始连续14天处于低风险,则第date+14天(含),所有该地区的被隔离人员立即解除隔离。

query(int date): 在第date天(含)时,按人员编号升序,依次返回每个人累计被隔离的天数。

输出保证:

a. 所有接口调用按照date非严格递增顺序

b. 同一天中,increaseRisk或者decreaseRisk调用排在所有travel调用之前,query调用排在所有其他调用之后

c. 同一天同一地区调用increaseRisk和decreaseRisk的次数之和不会超过一次(即风险不会来回切换)

d. 调用increaseRisk或decreaseRisk一定会产生风险切换(比如不会出现已经高风险地区再调用increaseRisk的情况)

样例:

输入

RiskMonitor([1,1])

travel([2, 1, 0])

increaseRisk(5, 1)

query(5)

travel(19,1,1)

decreaseRisk(21, 1)

query(22)

travel(25, 1, 1)

travel(35, 0, 0)

query(37)

输出:

null

0

null

[1, 0]

-1

null

[18, 0]

0

0

[30, 0]

题目解答:

# 现有一套用于管理疫情下人员流动风险的软件系统,请实现以下接口:
# RiskMonitor(int[] people):系统初始化,people[i]的下标表示人员编号,值表示所在地区的编号。初始时所有地区(包括没人的地区)都为低风险,系统初始为第0天。
# travel(int date, int peopleid, int regionid): 在第date天时,人员peopleid前往目的地regionid旅行。
# a. 如果该人员已经在该地区regionid,则停留在原地,并返回1;
# b. 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回-1;
# c. 否则旅行成功,该人员从date天(含)开始位于新地区,返回0。
# increaseRisk(int date, int regionid): 第date天(含)时,地区regionid变成高风险。当前该地区人员立即被隔离。
# decreaseRisk(int date, int regionid):在第date天(含)时,地区regionid变成低风险。
# a. 如果该地区从date开始连续14天处于低风险,则第date+14天(含),所有该地区的被隔离人员立即解除隔离。
# query(int date): 在第date天(含)时,按人员编号升序,依次返回每个人累计被隔离的天数。# 分析题意
# 对象(属性)
# # a. 如果该人员已经在该地区regionid,则停留在原地,并返回1;
# # b. 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回-1;
# -->因此人员需要所在地区属性, 是否被隔离属性; 地区需要风险等级属性;
# people(编号, 所在区域, 是否被隔离)
# region(编号, 风险等级)# 地区变成高风险,该地区所有人员立即被隔离
# 地区变成低风险,从date开始连续14天处于低风险,该地区所有隔离人员解除隔离
# -->因此地区需要有人员属性
# region(编号, 风险等级, 地区所有人员)  -->数据结构 regin_dict = {region_id: {"level": level, "peoples": [peoples]}}# query(int date): 在第date天(含)时,按人员编号升序,依次返回每个人累计被隔离的天数。
# -->因此人员需要被隔离天数属性
# people(编号, 所在区域, 是否被隔离, 上次隔离天数, 隔离开始时间, 隔离结束时间)  --->数据结构 people_dict = {people_id: {
# "region_id": region, "status": status, "total_days": total_days, "start_day": start_day, "end_day": end_day}}from typing import List
from collections import defaultdictclass RiskMonitor:def __init__(self, people: List[int]):# 保存每个区域的人员self.region_dict = defaultdict(list)# 保存每个区域的风险等级self.region_staus = defaultdict(int)# 保存每个人的状态self.people_dict = defaultdict(dict)# 初始化for people_id, region_id in enumerate(people):self.region_dict[region_id].append(people_id)self.region_staus[region_id] = 0self.people_dict[people_id] = {"region_id": region_id, "status": 0, "total_days": 0, "start_day": 0, "end_day": 0}print("null")def update_people(self, date):for people_status in self.people_dict.values():# 隔离的人状态需要更新if people_status["status"] == 1:if people_status["end_day"] > 0 and date > people_status["end_day"]:total_days = people_status["total_days"] + people_status["end_day"] - people_status["start_day"] + 1people_status["total_days"] = total_dayspeople_status["status"] = 0people_status["start_day"] = 0people_status["end_day"] = 0else:total_days = people_status["total_days"] + date - people_status["start_day"] + 1people_status["total_days"] = total_dayspeople_status["start_day"] = date + 1def travel(self, date: int, people_id: int, region_id: int) -> int:# 更新一下状态self.update_people(date)# 如果该人员已经在该地区regionid,则停留在原地,并返回1if self.people_dict[people_id]["region_id"] == region_id:print(1)return 1# 如果该人员已经被隔离,或者目的地此时为高风险,则停留在原地,返回 - 1if self.people_dict[people_id]["status"] == 1 or self.region_staus[region_id] == 1:print(-1)return -1# 否则旅行成功,该人员从date天(含)开始位于新地区,返回0# 从旧区域中移除该人员self.region_dict[self.people_dict[people_id]["region_id"]].remove(people_id)# 更新该人员所在区域为新区域self.people_dict[people_id]["region_id"] = region_id# 在新区域中人员列表中增加该人员self.region_dict[region_id].append(people_id)print(0)return 0def increase_risk(self, date: int, region_id: int) -> int:# 第date天(含)时,地区regionid变成高风险。当前该地区人员立即被隔离self.update_people(date-1)self.region_staus[region_id] = 1for people_id in self.region_dict[region_id]:self.people_dict[people_id]["status"] = 1self.people_dict[people_id]["start_day"] = dateself.people_dict[people_id]["end_day"] = 0print("null")def decrease_risk(self, date: int, region_id: int) -> int:# 在第date天(含)时,地区regionid变成低风险# a. 如果该地区从date开始连续14天处于低风险,则第date+14天(含),所有该地区的被隔离人员立即解除隔离。self.region_staus[region_id] = 0for people_id in self.region_dict[region_id]:self.people_dict[people_id]["end_day"] = date + 13# 更新当天的状态self.update_people(date)print("null")def query(self, date: int) -> List[int]:# 更新一下当天状态self.update_people(date)query_list = []for value in self.people_dict.values():query_list.append(value["total_days"])print(query_list)return query_list

总结:

1、根据题目描述列出对象及其属性,有些属性根据题目描述就可以得到, 有些属性需要根据题目内容和实际要求解的结果自定义。

2、根据对象及其属性选择合适的数据结构,例如字典套字典,字典套列表等。

3、各个对象之前存在某种关联关系。

对象1(属性1,属性2...)

对象2(属性2, 属性2, 属性3...)

对象3(属性1...)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“土猪拱白菜” 的学霸张锡峰,如今也苦于卷后端

大家好,我是程序员鱼皮,前几天在网上刷到了一个视频,是对几年前高考励志演讲的学霸张锡峰的采访。 不知道大家有没有看过他的演讲视频。在演讲中,衡水中学的学霸张锡峰表达了城乡孩子差距大、穷人家的孩子只想要努力成为父母的骄…

[C#]使用C#部署yolov10的目标检测tensorrt模型

【测试通过环境】 win10 x64vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super cuda和tensorrt版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:T…

博客论坛系统java博客管理系统基于springboot+vue的前后端分离博客论坛系统

文章目录 博客论坛系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 博客论坛系统 一、项目演示 博客论坛系统 二、项目介绍 基于springbootvue的前后端分离博客论坛系统 系统角色&#xff1a…

java程序员写博客的方法论

作为一名Java程序员,撰写技术博客是一种提升个人品牌、分享知识以及巩固学习成果的有效方式。以下是一些关于如何高效撰写高质量Java技术博客的方法论建议: 1. 明确目标受众 确定你的读者是谁:初学者、中级开发者还是高级工程师&#xff1f…

【Qt】QT textBrowser 设置字体颜色和大小

1. 效果 2. 代码 {ui->methodText->append("<font size9 colorgreen> dddddddddd </font>");ui->methodText->append("<font size9 colorred> vvvvvvvvvv </font>"); }

局域网监控软件有哪些:五款好用的网络监控神器分享(收藏篇)

在日益复杂的企业网络环境中&#xff0c;有效地监控局域网内的活动对于确保网络安全、提高工作效率和维护企业资产至关重要。 为此&#xff0c;精选了五款市场上广受好评的局域网监控软件&#xff0c;它们各自具备独特的功能和优势&#xff0c;能够满足不同规模企业的需求&…

如何开发高效服务(C++ )

在 C 开发高效服务器时&#xff0c;常用的开发模式和设计模式能够帮助你构建高效、可扩展和可维护的服务器。以下是一些常见的模式和设计模式&#xff1a; 1. 并发和并行编程模型 1.1 Reactor 模式 Reactor 模式是一种事件驱动设计模式&#xff0c;广泛用于高性能服务器编程…

【七合一】字典词典成语古诗词造句英语单词文库

帝国CMS7.5 UTF-8 系统开源&#xff0c;不限域名 采用静态伪静态&#xff08;会缓存静态文件&#xff09; 一款7合一的字词句诗典籍模板&#xff0c;包含字典、词典、成语、名句、诗词、古籍、英语、作文、等等。是一款养站神器。 作文范文,作文范文可生成word文档下载能自由…

【面经总结】Java集合 - Map

Map 概述 Map 架构 HashMap 要点 以 散列(哈希表) 方式存储键值对&#xff0c;访问速度快没有顺序性允许使用空值和空键有两个影响其性能的参数&#xff1a;初始容量和负载因子。 初始容量&#xff1a;哈希表创建时的容量负载因子&#xff1a;其容量自动扩容之前被允许的最大…

矩阵练习2

48.旋转图像 规律&#xff1a; 对于矩阵中第 i行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组&#xff0c;如果不想使用额外的内存&#xff0c;可以用一个临时变量 。 还可以通…

【Linux】进程_4

文章目录 五、进程4. 进程状态5. 进程优先级6. 进程的调度和转换 未完待续 五、进程 4. 进程状态 当进程属于挂起状态时&#xff0c;进程的可执行程序代码和数据均会被从内存中换入到磁盘中&#xff0c;此时进程的PCB并没有消失&#xff0c;只要操作系统还需要管理这个进程&a…

C++11左值、右值

知识回顾&#xff0c;详解引用 简单概括&#xff0c;引用就是给已存在对象取别名&#xff0c;引用变量与其引用实体共用同一块内存空间 左右值区分 注意&#xff1a;不一定左边的都是左值&#xff0c;右边的都是右值 左边的也可能是右值&#xff0c;等号右边的也可能是左值 …

Linux C语言:函数的基本用法及传参

一、函数的基本用法 1、main函数 int main(int argc, const char * argv[]) { printf("Hello world\n"); return 0; }数据类型 函数名称 (参数) { //.... return 表达式 } 2、函数 函数是一个完成特定功能的代码模块&#xff0c;其程序代码独立&#xff0c;通常要…

Java注解@Transa1ctional失效特殊情况

最近接手了一个项目需要在上面新加一个模块&#xff0c;我这边直接把之前的模块复制一份改改&#xff0c;去掉多余的文件就开始写了&#xff0c;但是就在一小时前&#xff0c;我调试接口的时候突然就发现事务回滚失效了&#xff0c;准确的说是事务都没有正常开启&#xff0c;这…

Linux vim 文本编辑 操作文本 三种模式

介绍 vi 是一个经典的行编辑器&#xff0c;支持模式编辑&#xff08;包括普通模式、插入模式和命令模式&#xff09;。 vim 保留vi核心功能的基础上&#xff0c;增加了多级撤销、语法高亮、插件支持等高级功能。 两者的最大区别&#xff0c;简单的来说vim就是vi的增强版 三…

Kafka生产者消息发送流程原理及源码分析

Kafka是一个分布式流处理平台,它能够以极高的吞吐量处理数据。在Kafka中,生产者负责将消息发送到Kafka集群,而消费者则负责从Kafka集群中读取消息。本文将探讨Kafka生产者消息发送流程的细节,包括消息的序列化、分区分配、记录提交等关键步骤。 先看一个生产者发送消息的代…

LaDM3IL:多实例学习用于免疫库分类

一个人的免疫组库由某一时间点的大量适应性免疫受体组成&#xff0c;代表了该个体的适应性免疫状态。免疫组库分类和相关受体识别有可能为新型疫苗的开发做出贡献。大量的实例对免疫组库分类提出了挑战&#xff0c;这可以表述为大规模多实例学习 (MMIL&#xff0c;Massive Mult…

pdf.js实现web h5预览pdf文件(兼容低版本浏览器)

注意 使用的是pdf.js 版本为 v2.16.105。因为新版本 兼容性不太好&#xff0c;部分手机预览不了&#xff0c;所以采用v2版本。 相关依赖 "canvas": "^2.11.2", "pdfjs-dist": "^2.16.105", "core-js-pure": "^3.37.…

苹果新型基于home app的骚扰

近期很多用户收到了新型骚扰信息&#xff0c;通过「家庭」邀请。 故障回显&#xff1a; 你会有到一条邀请你加入 Apple 智能家庭的邀请信息&#xff0c;但邀请信息的内容是骚扰信息&#xff0c;且骚扰信息中通常携带链接&#xff0c;千万不要随意打开。 这种骚扰方式暂时没有…

通信协议—Modbus

1、modbus简介 Modbus服务器&#xff1a;接收处理来自客户端的请求&#xff0c;并返回相应的响应&#xff1b; Modbus客户端&#xff1a;向Modbus服务器发送请求&#xff0c;并接收服务器返回的响应的设备或程序&#xff1b; 2、modbus poll调试工具下载 modbus poll用于测…