看病要排队这个是地球人都知道的常识

2024-09-07 22:12

本文主要是介绍看病要排队这个是地球人都知道的常识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝

唯有付出,才有丰富的果实收获!

看病要排队这个是地球人都知道的常识。
不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么少)同时看病。而看病的人病情有轻重,所以不能根据简单的先来先服务的原则。所以医院对每种病情规定了10种不同的优先级。级别为10的优先权最高,级别为1的优先权最低。医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治。如果遇到两个优先权一样的病人的话,则选择最早来排队的病人。

现在就请你帮助医院模拟这个看病过程。

Input

输入数据包含多组测试,请处理到文件结束。
每组数据第一行有一个正整数N(0<N<2000)表示发生事件的数目。
接下来有N行分别表示发生的事件。
一共有两种事件:
1:"IN A B",表示有一个拥有优先级B的病人要求医生A诊治。(0<A<=3,0<B<=10)
2:"OUT A",表示医生A进行了一次诊治,诊治完毕后,病人出院。(0<A<=3)

Output

对于每个"OUT A"事件,请在一行里面输出被诊治人的编号ID。如果该事件时无病人需要诊治,则输出"EMPTY"。
诊治人的编号ID的定义为:在一组测试中,"IN A B"事件发生第K次时,进来的病人ID即为K。从1开始编号。

Sample

InputOutput
7
IN 1 1
IN 1 2
OUT 1
OUT 2
IN 2 1
OUT 2
OUT 1
2
IN 1 1
OUT 1
2
EMPTY
3
1
1
#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;// 定义病人结构体
struct Patient {int id;      // 病人的编号int priority; // 病人的优先级// 构造函数Patient(int id, int priority) : id(id), priority(priority) {}// 自定义比较运算符,用于priority_queue中的元素比较// 返回true如果当前对象应该排在参数对象之前friend bool operator<(const Patient &a, const Patient &b) {if (a.priority == b.priority) { // 如果优先级相同return a.id > b.id; // 则选择编号较小(即先来)的病人}return a.priority < b.priority; // 否则选择优先级较高的病人}
};int main() { ios::sync_with_stdio(false); // 禁用C风格I/O同步,提高效率cin.tie(0); // 解绑cin与cout的绑定,避免缓冲区延迟int n; // 事件总数while (cin >> n && n != 0) { // 处理多组测试数据priority_queue<Patient> doctors[4]; // 初始化四位医生的优先队列,索引0不用int eventCount = 0; // 初始化病人的编号计数器// 读取并处理每个事件while(n--) {string command; // 命令类型cin >> command;if (command == "IN") { // 如果是“入队”命令int doctor, priority; // 医生编号和病人的优先级cin >> doctor >> priority;// 创建一个新的病人对象,并将其加入对应医生的队列Patient newPatient(++eventCount, priority);doctors[doctor].push(newPatient); } else if (command == "OUT") { // 如果是“出队”命令int doctor; // 医生编号cin >> doctor;if (!doctors[doctor].empty()) { // 如果医生队列不为空// 输出当前队列最前面的病人编号cout << doctors[doctor].top().id << endl;// 移除当前队列最前面的病人doctors[doctor].pop(); } else { // 如果医生队列为空cout << "EMPTY\n"; // 输出“EMPTY”}}}}return 0; 
}

算法分析

数据结构
  • Patient 结构体: 包含病人的优先级 priority 和编号 id
  • priority_queue<Patient>: 每位医生有一个优先队列,用于存储等待诊治的病人。优先队列中的元素按优先级降序排列,如果优先级相同,则按编号升序排列(即先来的病人优先)。
  • vector<priority_queue<Patient>> doctors: 一个向量,用于存储三位医生各自的优先队列。索引0位置不使用,因为医生编号从1开始。
输入处理
  • 读取事件数量 eventCount:每一组测试数据的第一行包含发生事件的数量。
  • 处理每个事件:对于每个事件,根据命令类型执行相应的操作。
命令处理
  • IN 命令 (command == 1):
    • 读取医生编号 doctor 和病人的优先级 priority
    • 增加全局病人数 patientId 计数器,为新病人分配一个唯一的ID。
    • 创建一个 Patient 对象,包含给定的优先级和新的ID。
    • 将 Patient 对象推入对应医生的优先队列中。
  • OUT 命令 (command != 1):
    • 读取医生编号 doctor
    • 如果医生的队列不为空,则:
      • 输出队列顶部病人的ID。
      • 弹出队列顶部的病人。
    • 否则,输出 "EMPTY" 表示没有病人等待诊治。

时间复杂度

  • 插入病人到优先队列的时间复杂度是 O(log N),其中 N 是队列中的病人数量。
  • 从优先队列中弹出病人的时间复杂度也是 O(log N)。
  • 因此,对于每个事件,平均时间复杂度为 O(log N)。

空间复杂度

  • 最坏情况下,所有的病人都进入队列,空间复杂度为 O(N),其中 N 是所有事件的数量。

总结

该算法有效地利用了优先队列来管理每位医生的病人队列,并且通过全局计数器来唯一标识每个病人。这样可以保证每次诊治都是优先级最高的病人,并且在优先级相同的情况下选择了最早到来的病人。这种设计使得算法既简单又高效,能够很好地处理大规模的输入数据。

这篇关于看病要排队这个是地球人都知道的常识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146305

相关文章

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言: 一、说话的真实程度分级 二、说谎动机分级:善意谎言、中性谎言、恶意谎言 三、小心:所谓真相:只说对自己有利的真相 四、小心:所谓真相:就是别人想让你知道的真相 五、小心:所谓善解人意:就是别人只说你想要听到的话 前言: 何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相! 人与人交流话语中,处处充满了不真实,完全真实的只是其中一小部分,这

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏

纳米材料咋设计?蛋白质模块咋用?看这里就知道啦!

大家好,今天我们来了解一项关于蛋白质纳米材料设计的研究——《Blueprinting extendable nanomaterials with standardized protein blocks》发表于《Nature》。蛋白质结构复杂,其组装体的设计颇具挑战。但近期的研究取得了新突破,通过设计标准化的蛋白质模块,如线性、曲线和转角模块等,实现了纳米材料的可扩展性和规律性。这

只有对比,才知道伊利股份半年报的高成色

投资圈有句名言:“当潮水退去的时候,才知道谁在裸泳”。大环境顺风顺水,大家看着都挺好,只有环境变化,才更容易分辨出来,谁才是真有实力。当下,在消费环境弱复苏的大背景下,高成色的半年报业绩让伊利股份的实力一览无余。 8月29日,伊利股份发布中期业绩。上半年,面对严峻复杂的市场环境,伊利直面挑战、主动调整,实现营业总收入599.15亿元,归母净利润75.31亿元,均稳居行业第一。

Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

目录 1、冯诺伊曼体系结构 问题一:为什么在体系结构中存在存储器(内存)? 存储单元总结: 问题二:为什么程序在运行的时候,必须把程序先加载到内存? 问题三:请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 2、操作系统 2.1操作系统的概念: 我们首先要明白什么是管理: 2.2为什么要有操作系统? 2.3操作系统如何保证稳定和安全呢?(利用系统调用函数解决)

从新手到大师:Java并发编程你必须知道的那些事!

文章目录 1 进程和线程的区别?2 如何创建一个线程实例并且运行它?3 Runnable 和 Callable 接口有什么区别?它们是如何使用的?4 方法定义中 synchronized 关键字的含义是什么?静态方法?在一个块之前 ? 1 进程和线程的区别? 进程是独立的执行单元,拥有自己的资源和内存,而线程是在进程内的执行单元,共享进程的资源。线程可以高效地执行任务,但需

程序猿必须知道的一些有用的(外国)网站

在学习计算机科学(CS)时,必须知道一些有用的网站,以便随时掌握信息,了解技术前沿和学习新技术。下面是你应该访问的一些网站的不详尽的列表,一旦我得到了另一个链接,这个列表就会被更新,但是你也可以添加你知道的网站来做贡献。 索引 当你遇到困境时 新闻 初学者的编码实践 给那些想开始一个小项目却找不到点子的人 一般编码建议 编码风格 一般工具 面试的准备

Spark你需要知道这些

谈到 Spark,我们总是强调它比 Hadoop 更高效。为什么它可以更高效呢?是因为它优先使用内存存储?还是因为它拥有比 MapReduce 更简单高效的计算模型? 与 Hadoop 作业的区别 我们知道在 Hadoop 中,一个作业(Job)可以有一个或多个Task,Task 又可以分成 Map Task 和 Reduce Task。每个Task 分别在自己的进程中运行,Hadoop 中一

MFC首先要知道的--程序执行顺序

MFC的程序执行顺序 很多刚学MFC的人都会被MFC给弄的晕头转向。以前传统的C语言中的main()不见了,window sdk api 中的WinMain()函数也不见了,到底用MFC编写的程序是如何开始运行的呢?到底MFC有没有遵从最基本的C++的标准呢?到底MFC的代码运行的顺序又是怎么样的呢?那么多个文件,那么多函数,到底哪一个先运行,哪一个后运行,哪一个调用哪一个,哪一个又被哪一个调用

还不知道视频合并怎么弄?不妨试试这4个方法

记录生活,就像是在编织一本流动的日记,每一页都充满了色彩和声音。在这个过程中,视频成为了我们记录日常趣事的绝佳方式。 但问题来了,面对手机里零散的视频片段,我们该如何将它们合并,制作成一段流畅的生活Vlog呢? 别急,接下来,本文将为你揭晓“视频合并怎么制作”的秘诀,让你的生活Vlog更加生动有趣! 方法一:使用【剪辑魔法师】进行视频合并 ◆适用人群:适合希望快速拼接视频,又不想花太多