题意:给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 22 struct 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[],ans;
int arrive[],treated[]; 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 = ;
int i,j;
while(scanf("%d%d",&n,&Tim)!=EOF && (n+Tim))
{
Pcnt = ;
ans.clear();
while(scanf("%d",&arrive[Pcnt]) && arrive[Pcnt] != -)
{
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=;i<n;i++) //n个医生准备
T.push(treat(Tim,-));
for(i=;i<Pcnt;i++)
T.push(treat(arrive[i],i)); //编号i
int doctor = ;
memset(treated,-,sizeof(treated));
int pcnt = ;
while(pcnt < Pcnt)
{
int nowt = T.top().tim;
while(!T.empty() && T.top().tim == nowt)
{
if(T.top().ind == -) //空闲doctor
doctor++;
else
{
int pid = T.top().ind;
treated[pid]++;
if(treated[pid] >= pat[pid].size()) //全部疗程完成
{
ans.push_back(node(nowt,arrive[pid]));
pcnt++;
}
else
P.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,-)); //此时空闲
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=;i<ans.size();i++)
printf("Patient %d released at clock = %d\n",ans[i].y,ans[i].x);
}
return ;
}

UVALive 6093 Emergency Room --优先队列实现的模拟的更多相关文章

  1. Northwestern European Regional Contest 2016 NWERC ,F题Free Weights(优先队列+Map标记+模拟)

    传送门: Vjudge:https://vjudge.net/problem/Gym-101170F CF: http://codeforces.com/gym/101170 The city of ...

  2. UVALive 5888 Stack Machine Executor (栈+模拟)

    Stack Machine Executor 题目链接: http://acm.hust.edu.cn/vjudge/problem/26636 Description http://7xjob4.c ...

  3. UVALive 3486/zoj 2615 Cells(栈模拟dfs)

    这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...

  4. UVALive 2323 Modular Multiplication of Polynomials(模拟)

    这是一个相对简单的模拟,因为运算规则已经告诉了我们,并且比较简单,不要被吓到…… 思路:多项式除以另外一个多项式,如果能除,那么他的最高次一定被降低了,如果最高次不能被降低,那说明已经无法被除,就是题 ...

  5. UVALive 3135--Argus+自己定义优先队列的优先规则

    题目链接:id=18684">点击进入 仅仅是题意比較难懂,读懂题后全然能够用优先队列水过去.这次学会自己定义优先队列的优先规则,事实上就是在结构体中重载一下<运算符. 代码例如 ...

  6. uva11997 K Smallest Sums&&UVALive 3135 Argus(优先队列,多路归并)

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  7. UVaLive 4254 Processor (二分+优先队列)

    题意:有n个任务,每个任务有三个参数,r,d,w,表示该任务必须在[r,d]之间执行,工作量是w,处理器执行速度可以变化,当执行速度是s的时候, 一个工作量是w的任务需要需要的执行时间是w/s个工作单 ...

  8. Luogu P2278 [HNOI2003]操作系统【优先队列/重载运算符/模拟】 By cellur925

    题目传送门 本来是照着二叉堆的题去做的...没想到捡了个模拟...不过模拟我都不会...我好弱啊... 其实核心代码并不长,比辰哥的标程短到不知哪里去...但是思路需要清晰. 读题的时候我明白,当有优 ...

  9. UVaLive 6802 Turtle Graphics (水题,模拟)

    题意:给定一个坐标,和一行命令,按照命令走,问你有多少点会被访问超过一次. 析:很简单么,按命令模拟就好,注意有的点可能走了多次,只能记作一次. 代码如下: #pragma comment(linke ...

随机推荐

  1. java中的代码块执行顺序

    /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代码.每次 ...

  2. jquery.cookie.js 用法

    jquery.cookie.js 用法   一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cookie.js 的配置 首先包含jQuery的库文件,在后面包含 j ...

  3. C语言动态调用库(转)

    转自:http://cloverprince.iteye.com/blog/481309 现有一个主程序用C语言写成.现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称 ...

  4. [vim] vim入门

    1. 概述 工欲善其事 必先利其器.vim是非常好用的文本编辑器,可以将它看作是vi的进阶.绝大多数Unix系统都会内置vi编辑器,vi是文本编辑器,vim是程序编辑器.相比vi,它可以根据文件的类型 ...

  5. jQuery owlcarousel 旋转木马

    owlcarousel是一款猫头鹰旋转木马插件.OwlCarousel优势兼容所有浏览器支持响应式支持 CSS3 过度支持触摸事件支持 JSON 及自定义 JSON 格式支持进度条支持自定义事件支持延 ...

  6. js实现拖拽

    拖拽:最核心是三个事件,鼠标按下,鼠标移动,鼠标弹起.按下时激活拖拽,然后时刻根据鼠标的位置来更新物体的left和top值,达到跟随鼠标的效果,鼠标弹起则取消拖拽. 以下是代码: <!DOCTY ...

  7. 一道灵活的css笔试题

    今天在网上看到一css笔试题,乍一看很简单,实则内部暗藏玄机,题目大概是:九宫格,每格长宽50px,边框宽度5px,鼠标经过边框变红,效果如下: 鼠标路过时: 以下是代码(如有不足之处望多加指正) & ...

  8. ArcGIS知乎上有哪些干货可以推荐?

    http://zhihu.esrichina.com.cn/question/12709

  9. R语言学习笔记:SQL操作

    虽然R很强大,但如果对SQL非常熟悉,也不能浪费这项技能了,可以用上sqldf包,从example("sqldf")抄了几条用法放在这里,以后可能会用上. library(&quo ...

  10. 百度Couldn't load BaiduMapSDK_v2_4_1 from loader dalvik

    原文链接:http://liuzhichao.com/p/1463.html 在使用百度定位SDK的时候,明明已经加入了liblocSDK3.so,Manifest中也添加了相应权限,注册了com.b ...