题意:模拟患者做手术。

其条件为:医院有Nop个手术室、准备手术室要Mop分钟,另有Nre个恢复用的床、准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟。现在医院早上开张了,给你一张患者的表,有Npa个患者等着做手术,每个患者的的信息有:名字、做手术需要的时间、恢复需要的时间。只要有空的手术室位就安排患者进去,优先安排门牌号低的。若多人同时竞争,输入列表靠前的先进。进入恢复室的优先顺序是,也是优先安排床号靠前的床,同时做完手术的人按照手术室的门牌号小的 (很奇葩的设定)优先。


代码:(Accepted,0.000s)

//UVa212 - Use of Hospital Facilities
//Accepted 0.000s
//#define _XIENAOBAN_
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<utility>
#include<string>
#include<vector>
#include<queue>
#define ipt cin
#define opt cout//just for convenience and appearance, because size("cout"+" ")=5, which is longer than a tab(which is 4)
#define time_convert(t) setw(2) << (t / 60) << ':' << setfill('0') << setw(2) << (t % 60) << setfill(' ')
using namespace std; struct ROOM {
int id, at;
ROOM() {}
ROOM(int a, int b) :id(a), at(b) {}
bool operator <(const ROOM& that) const {
if (at != that.at) return at > that.at;
return id > that.id;
}
};
struct PATIENT {
string name;
int id, room, bed, top, tre, t1, t2, t3, t4;
}; int Nop, Nre, Ts, Te, Mtr, Mop, Mre, Npa; int main()
{
#ifdef _XIENAOBAN_
#define gets(T) gets_s(T, 66666)
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif ios::sync_with_stdio(false);
while (ipt >> Nop) {
ipt >> Nre >> Ts >> Mtr >> Mop >> Mre >> Npa;
Te = 0, Ts *= 60;
vector<int> Top(Nop + 1, 0), Tre(Nre + 1, 0);
vector<PATIENT> Info(Npa + 1);
vector<int> Bre(Nre + 1, Ts);
priority_queue<ROOM> Rop;
for (int i(1);i <= Nop;++i) Rop.push(ROOM(i, Ts)); //For all the operating rooms
for (int N(1);N <= Npa;++N) {
auto& now(Info[N]);
now.id = N;
ROOM op(Rop.top());
Rop.pop();
ipt >> now.name >> now.top >> now.tre;
now.t1 = op.at;
now.t2 = now.t1 + now.top;
now.t3 = now.t2 + Mtr;
now.t4 = now.t3 + now.tre;
now.room = op.id;
op.at = now.t2 + Mop;
Top[op.id] += now.top;
Rop.push(op);
}
sort(Info.begin() + 1, Info.end(), [](PATIENT& a, PATIENT& b)->bool
{if (a.t2 != b.t2) return a.t2 < b.t2;return a.room < b.room;});//Sort by t2 //For all the recovery rooms
for (int N(1);N <= Npa;++N) {
auto& now(Info[N]);
int re;
for (re = 1;re <= Nre;++re)
if (Bre[re] <= now.t2) break;
now.bed = re;
Bre[re] = now.t4 + Mre;
Tre[re] += now.tre;
if (Te < now.t4) Te = now.t4;
}
sort(Info.begin() + 1, Info.end(), [](PATIENT& a, PATIENT& b) {return a.id < b.id;});//Sort by id //Output
opt << " Patient Operating Room Recovery Room\n"
<< " # Name Room# Begin End Bed# Begin End\n"
<< " ------------------------------------------------------\n";
for (int N(1);N <= Npa;++N) {
auto& now(Info[N]);
opt << setw(2) << N << " " << left << setw(10) << now.name << right << setw(2)
<< now.room << " " << time_convert(now.t1) << " " << time_convert(now.t2) << " " << setw(2)
<< now.bed << " " << time_convert(now.t3) << " " << time_convert(now.t4) << '\n';
}
opt << '\n'
<< "Facility Utilization\n"
<< "Type # Minutes % Used\n"
<< "-------------------------\n";
for (int N(1);N <= Nop;++N) {
opt << "Room " << setw(2) << N << setw(8) << Top[N]
<< setw(8) << fixed << setprecision(2) << (Top[N] * 100.0 / (float)(Te - Ts)) << '\n';
}
for (int N(1);N <= Nre;++N) {
opt << "Bed " << setw(2) << N << setw(8) << Tre[N]
<< setw(8) << fixed << setprecision(2) << (Tre[N] * 100.0 / (float)(Te - Ts)) << '\n';
}
cout << endl;
}
return 0;
}

分析:终于是本章节的最后一题啦!书上说很难,感觉其实不难啊,就是麻烦了点,写了好久。就是死在了一句话上“If two patients emerge from surgery at the same time, the patient with the lower number will be the first assigned to a recovery room bed.”(就是上面题意里加黑的那句)我还以为指的是患者编号,即患者输入顺序。结果WA。。。udebug上没有数据,不知道问题在哪里。自己做了一套数据发现了错误,百度查了别人的排序逻辑,才发现原来那个the patient with the lower number指的是在门牌号小的手术室做手术的患者。那个number竟然指的门牌号!所以只把sort函数的lambda比较函数改了一小下就AC了。

手术室的模拟使用了优先队列,空一个房间就来一个人,但是恢复床位不能用优先队列。因为恢复床位进入可使用状态最早的不一定是床号最小的,即当有人要转移到床位时可使用床位可能不止一个,和他做完手术的时间有关系。

附:测试数据

10 30 01 16 15 1 30

Jones

90 140

Smith

10 200

Thompson

60 75

Albright

40 82

Poucher

33 209

Comer

10 201

Perry

3 188

Page

111 120

Roggio

69 100

Brigham

42 79

Nute

22 71

Young

38 50

Bush

26 40

Cates

120 32

Johnson

10 2

Jones

28 140

Smith

120 200

Thompson

23 75

Albright

19 82

Poucher

133 209

Comer

74 101

Perry

93 188

Page

111 223

Roggio

69 122

Brigham

42 79

Nute

22 71

Young

38 140

Bush

26 121

Cates

120 248

Johnson

10 50

[刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  2. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  3. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  4. [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...

  5. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation

    题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...

  6. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  7. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  8. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  9. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web

    题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...

随机推荐

  1. JavaScript作用域链和垃圾回收机制

    作用域链 基本概念: 在了解作用域链和内存之前,我们先了解两个概念,分别是执行环境和变量对象. 执行环境:定义变量或者函数有权访问的其他数据,决定了它们各自的行为.每个对象都有自己的执行环境. 变量对 ...

  2. css常用居中

    对一个已知大小的元素上下左右居中(已知大小了,直接margin也就行了): css如下:.parent{height:100px;width:100px;background:grey;positio ...

  3. 当在浏览器地址栏里输入URL后会发生什么事情

    其实这个很多大神已经说的很多了.但是为了自己更好的理解,在自己所接触的层面上,重新对自己讲解一下.当然,这是站在一个前端开发者的角度上来看问题的. 说说一次HTTP完整事务的过程 输入URL 浏览器从 ...

  4. jPaginate 一个非常好用的分页插件

    之前报馆项目用的前端框架easyui,还是用不太习惯,因此换了一个框架,最近为此找分页插件,偶然间看见一个非常好用的分页插件JPaginate Paginate是基于jquery的分页插件,非常轻量, ...

  5. 关于WAMPserver配置httpd.conf无法修改根目录解决方法

    最近在学习php开发, 在慕课网上先听了安装配置WAMP server的课,可是第二步配置网站根目录的地方就出错了,按照网课上讲的将httpd.conf文件中的 [Document] 和[Direct ...

  6. 转接口IC GM7150BN/ GM7150BC:CVBS转BT656芯片 低功耗NTSC/PAL 视频解码器

    1 概述    GM7150 是一款9 位视频输入预处理芯片,该芯片采用CMOS 工艺,通过I2C 总线与PC 或DSP 相连构成应用系统.    它内部包含1 个模拟处理通道,能实现CVBS.S-V ...

  7. 混合式app ionic2.x 手动搭建开发环境教程分享(nodejs,jdk,ant,androidsdk)

    1.ionic简介 为什么选用ionic: 彻底开源且免费 性能优异 基于红的发紫的AngularJs 漂亮的UI 强大的命令行(基于更热门的nodejs) 开发团队非常活跃 ngCordova,将主 ...

  8. SQL SERVER 远程备份DB

    --检查sqlserver所在服务的运行账号是否有权限访问共享文件夹,没有的话右键添加写权限 --开启权限sp_configure 'show advanced options', 1;gorecon ...

  9. OpenDigg安卓开源项目月报201704

    由OpenDigg 出品的安卓开源项目月报第一期来啦.我们的安卓开源月报集合了OpenDigg一个月来新收录的优质安卓开源项目,方便安卓开发人员便捷的找到自己需要的项目工具. DiscreteScro ...

  10. mac的终端为什么会显示git:(master),如何取消掉?

    今天在终端误操作,在主目录下执行git init命令,结果杯具了, 总是出现这个提示. 各种搜索解决方案,终于退出了. 方法如下: 删掉.git目录: rm -rf ~/.git