题意:给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 ;
}

最新文章

  1. XML 概述 (可扩展标记语言)
  2. CentOs中yum安装LAMP+PHPMYADMIN
  3. Practical JAVA (四)异常处理
  4. [原]Android打包之跨平台打包
  5. 50款免费名片设计模板 PSD 源文件下载《上篇》
  6. CentOS下更新python版本
  7. ionic pull to refresh 下拉更新頁面
  8. HDU 1015 Safecracker
  9. 如何使cron任务出错时发邮件
  10. Delphi 的各种错误信息(中英文)
  11. PCB打样镀层问题
  12. JS年月日三级联动下拉框日期选择代码
  13. 快了快了,你的 MacBook Pro 和 FineUICore!
  14. [深度应用]&#183;DC竞赛轴承故障检测开源Baseline(基于Keras 1D卷积 val_acc:0.99780)
  15. spring-springmvc-jdbc小案例
  16. shell编辑器vi的常用命令
  17. JSP、EL、JSTL
  18. ZOJ 1456 Minimum Transport Cost(Floyd算法求解最短路径并输出最小字典序路径)
  19. luogu P4342 [IOI1998]Polygon
  20. Trim Galore用法及参数考量

热门文章

  1. 蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事
  2. 使用PowerQuery操作OData数据
  3. C# Sqlite 序列
  4. js事件小记
  5. IOS集合NSSet与NSMutableSet知识点
  6. IOS UILabel 根据内容自适应高度
  7. iOS之UI--通讯录的实例关键知识技术点积累
  8. UVa 102 - Ecological Bin Packing(规律,统计)
  9. css中font-family的中文字体
  10. 日常工作生活中的做人做事道理[持续更新ing]