UVALive 6093 Emergency Room --优先队列实现的模拟
题意:给n个医生,这些医生有一个上班时间,然后给一些病人,病人有一个到达的时间,以及一些诊断,诊断有property(优先级)和duration(诊断时间)这两个属性,每个病人可能要诊断多次,最后问每个病人的全部疗程完成离开医院的时间是多少。
分析:用优先队列存储诊断,病人,然后模拟一个诊断过程,完成病人的个数等于病人数的时候就结束。具体看代码吧。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <cstdlib> using namespace std; #define N 100102 #define M 22struct treat {int tim,ind;treat(int _tim,int _ind):tim(_tim),ind(_ind){}treat(){}bool operator <(const treat& a)const{return tim > a.tim;} };struct node {int x,y;node(int _x,int _y):x(_x),y(_y){}node(){} };struct Patient {int id,pro,arrtim;Patient(int _id,int _pro,int _arrtim):id(_id),pro(_pro),arrtim(_arrtim){}Patient(){}bool operator <(const Patient& a)const{if(a.pro == pro)return arrtim > a.arrtim;return pro < a.pro;} };priority_queue<treat> T; priority_queue<Patient> P; vector<node> pat[506],ans; int arrive[506],treated[506];int cmp(node ka,node kb) {if(ka.x == kb.x)return ka.y < kb.y;return ka.x < kb.x; }int main() {int n,Tim,a,b,Pcnt,cs = 1;int i,j;while(scanf("%d%d",&n,&Tim)!=EOF && (n+Tim)){Pcnt = 0;ans.clear();while(scanf("%d",&arrive[Pcnt]) && arrive[Pcnt] != -1){pat[Pcnt].clear();while(scanf("%d%d",&a,&b) && (a+b)) //property,duration pat[Pcnt].push_back(node(a,b));Pcnt++;}while(!T.empty())T.pop();while(!P.empty())P.pop();for(i=0;i<n;i++) //n个医生准备T.push(treat(Tim,-1));for(i=0;i<Pcnt;i++)T.push(treat(arrive[i],i)); //编号iint doctor = 0;memset(treated,-1,sizeof(treated));int pcnt = 0;while(pcnt < Pcnt){int nowt = T.top().tim;while(!T.empty() && T.top().tim == nowt){if(T.top().ind == -1) //空闲doctordoctor++;else{int pid = T.top().ind;treated[pid]++;if(treated[pid] >= pat[pid].size()) //全部疗程完成 {ans.push_back(node(nowt,arrive[pid]));pcnt++;}elseP.push(Patient(pid,pat[pid][treated[pid]].x,arrive[pid]));}T.pop();}while(!P.empty() && doctor){int k = P.top().id;T.push(treat(nowt+pat[k][treated[k]].y,-1)); //此时空闲T.push(treat(nowt+pat[k][treated[k]].y,k)); //或者继续诊断此病人 P.pop();doctor--;}}sort(ans.begin(),ans.end(),cmp);printf("Case %d:\n",cs++);for(i=0;i<ans.size();i++)printf("Patient %d released at clock = %d\n",ans[i].y,ans[i].x);}return 0; }
View Code
转载于:https://www.cnblogs.com/whatbeg/p/3908275.html
UVALive 6093 Emergency Room --优先队列实现的模拟相关推荐
- java先进先出 循环队列,JavaScript队列、优先队列与循环队列
队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素 队列的理解 队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了 和栈很像,这不过队列是先入先 ...
- 数据结构编程实战汇总
出自数据结构与算法分析第二版(C) 一 引论 二 算法分析 三 表 栈 队列 四 树 五 散列 六 优先队列七 排序 优先队列实现事件模拟 :http://maozj.iteye.com/blog/ ...
- 2095 : 我只看看不写题(贪心)
you~~~ 题目描述 伴随着科技的发展,我们的生活也越来越多姿多彩,随着手机的普及,各种交友软件也在快速的发展. 小a是个老实人,当然只是自己理解而已,其实小a是个不折不扣的渣男.因为他在有女朋友的 ...
- UVA 1598 Exchange
这道题目难在阅读,翻译如下(第一段可以省略,从第二段开始) 订货薄会接收到一系列的消息,这些消息是订单或者是取消之前订单的请求.没有被取消的订单是激活状态的.订单类型分为购买订单和销售订单.每一个购买 ...
- c++实现哈夫曼huffman压缩文本
哈夫曼压缩原理就是构建二叉树,出现频率高的字母用更少的位数来表示,实现压缩的效果 比如字符串abcbbc 构建哈夫曼树 这样构建出编码表b->0,a->10, c->11 原本6个 ...
- linux 禁止文件修改时间,linux 修改文件的时间属性
二.修改文件时间 创建文件我们可以通过touch来创建.同样,我们也可以使用touch来修改文件时间.touch的相关参数如下: -a : 仅修改access time. -c : 仅修改时间,而不建 ...
- 哈尔滨理工大学第12届程序设计竞赛--ADK题
A割韭菜--线段树 题目链接: A-割韭菜_哈尔滨理工大学第12届程序设计竞赛(同步赛) (nowcoder.com) #include <bits/stdc++.h>using name ...
- HDU Problem - 6396 Swordsman(优先队列,模拟)
题目链接 Problem Description Lawson is a magic swordsman with kkk kinds of magic attributes v1,v2,v3,-,v ...
- 【PAT - 甲级1017】Queueing at Bank (25分)(优先队列,模拟)
题干: Suppose a bank has K windows open for service. There is a yellow line in front of the windows wh ...
最新文章
- SAP HUM 嵌套HU的盘点
- python selenium 验证码识别_Python网络爬虫之如何用代码识别图片验证码
- MySQL初始化脚本mysql_install_db使用简介及选项参数
- exit()函数学习
- stata中计算公式命令_stata学习笔记(三):计算五年内的ROA标准差所用到的一些知识...
- kafka的SASL的适用业务场景
- 曲苑杂坛--修改数据库名和文件组名
- 無題(後改為總有那麼一句話)
- c语言求1到20的各个阶乘,c语言求阶乘(c语言求1到20的阶乘)
- 常见测试用例设计方法1---等价类划分
- GeoGebra官方版下载
- WEB认证苹果手机锁屏后出现断开WI-Fi的现象和解决
- 活动回顾 | 浙大图灵大讲堂《数据库技术发展之道》圆满结束
- moviepy音视频剪辑:视频半自动追踪人脸打马赛克
- 《深入理解Java虚拟机(第2版)》-笔记
- 夏普电视的html接口,夏普电视投屏设置方法
- java计算机毕业设计舞蹈网站源码+lw文档+系统+数据库
- js区分手机端和PC端
- 基于51的多功能小风扇,可以实现定时,摇头,超声波自动调速等功能
- 操作系统的类型与结构---定义与分类