题意:给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 --优先队列实现的模拟相关推荐

  1. java先进先出 循环队列,JavaScript队列、优先队列与循环队列

    队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素 队列的理解 队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了 和栈很像,这不过队列是先入先 ...

  2. 数据结构编程实战汇总

    出自数据结构与算法分析第二版(C) 一 引论 二 算法分析 三 表 栈 队列 四 树 五 散列 六 优先队列七 排序  优先队列实现事件模拟 :http://maozj.iteye.com/blog/ ...

  3. 2095 : 我只看看不写题(贪心)

    you~~~ 题目描述 伴随着科技的发展,我们的生活也越来越多姿多彩,随着手机的普及,各种交友软件也在快速的发展. 小a是个老实人,当然只是自己理解而已,其实小a是个不折不扣的渣男.因为他在有女朋友的 ...

  4. UVA 1598 Exchange

    这道题目难在阅读,翻译如下(第一段可以省略,从第二段开始) 订货薄会接收到一系列的消息,这些消息是订单或者是取消之前订单的请求.没有被取消的订单是激活状态的.订单类型分为购买订单和销售订单.每一个购买 ...

  5. c++实现哈夫曼huffman压缩文本

    哈夫曼压缩原理就是构建二叉树,出现频率高的字母用更少的位数来表示,实现压缩的效果 比如字符串abcbbc 构建哈夫曼树 这样构建出编码表b->0,a->10,  c->11 原本6个 ...

  6. linux 禁止文件修改时间,linux 修改文件的时间属性

    二.修改文件时间 创建文件我们可以通过touch来创建.同样,我们也可以使用touch来修改文件时间.touch的相关参数如下: -a : 仅修改access time. -c : 仅修改时间,而不建 ...

  7. 哈尔滨理工大学第12届程序设计竞赛--ADK题

    A割韭菜--线段树 题目链接: A-割韭菜_哈尔滨理工大学第12届程序设计竞赛(同步赛) (nowcoder.com) #include <bits/stdc++.h>using name ...

  8. HDU Problem - 6396 Swordsman(优先队列,模拟)

    题目链接 Problem Description Lawson is a magic swordsman with kkk kinds of magic attributes v1,v2,v3,-,v ...

  9. 【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 ...

最新文章

  1. SAP HUM 嵌套HU的盘点
  2. python selenium 验证码识别_Python网络爬虫之如何用代码识别图片验证码
  3. MySQL初始化脚本mysql_install_db使用简介及选项参数
  4. exit()函数学习
  5. stata中计算公式命令_stata学习笔记(三):计算五年内的ROA标准差所用到的一些知识...
  6. kafka的SASL的适用业务场景
  7. 曲苑杂坛--修改数据库名和文件组名
  8. 無題(後改為總有那麼一句話)
  9. c语言求1到20的各个阶乘,c语言求阶乘(c语言求1到20的阶乘)
  10. 常见测试用例设计方法1---等价类划分
  11. GeoGebra官方版下载
  12. WEB认证苹果手机锁屏后出现断开WI-Fi的现象和解决
  13. 活动回顾 | 浙大图灵大讲堂《数据库技术发展之道》圆满结束
  14. moviepy音视频剪辑:视频半自动追踪人脸打马赛克
  15. 《深入理解Java虚拟机(第2版)》-笔记
  16. 夏普电视的html接口,夏普电视投屏设置方法
  17. java计算机毕业设计舞蹈网站源码+lw文档+系统+数据库
  18. js区分手机端和PC端
  19. 基于51的多功能小风扇,可以实现定时,摇头,超声波自动调速等功能
  20. 操作系统的类型与结构---定义与分类

热门文章

  1. 假如我是陈一舟--我的大社交生态系统战略
  2. Linux ibm mq 教程,IBM MQ 使用指南
  3. leetcode算法题--Queue Reconstruction by Height
  4. C 引用和指针的区别
  5. C++ 编译器多态与运行时多态
  6. python给图片添加字符
  7. 嵩天python笔记_第一篇python笔记
  8. mysql服务的基本操作_MySql(一)mysql服务的基本操作及环境配置
  9. SQL数据库操作完全手册
  10. Mybatis原理分析之一:从JDBC到Mybatis