题意:模拟患者做手术。

其条件为:医院有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. nicescroll 配置参数

    jQuery滚动条插件兼容ie6+.手机.ipad http://www.areaaperta.com/nicescroll/ 配置参数 当调用“niceScroll”你可以传递一些参数来定制视觉方面 ...

  2. JavaScript 简介及语法语句

    JS脚本语言 全称JavaScript:网页里面使用的脚本语言                      非常强大的语言 基础语法 注释语法    单行注释//    多行注释/**/输出语法     ...

  3. Unity 3D Framework Designing(4)——设计可复用的SubView和SubViewModel(Part 2)

    在我们设计和开发应用程序时,经常要用到控件.比如开发一个客户端WinForm应用程序时,微软就为我们提供了若干控件,这些控件为我们提供了可被定制的属性和事件.属性可以更改它的外观,比如背景色,标题等, ...

  4. HTTP协议(三)

    一.首先我们画一个图来看一下HTTP协议: 难道方法只有POST GET吗?NO,还有一些少用的方法. 二.请求方法有哪些? GET POST HEADER PUT TRACE DELETE OPTI ...

  5. Ubuntu下搜狗输入法突然无法输入中文

    百度了很久的,后面看到这个帖子,找到解决办法.引用:http://blog.csdn.net/kiss_the_sky/article/details/62238529 删除配置文件,重启搜狗 ubu ...

  6. [认证授权] 2.OAuth2(续) & JSON Web Token

    0. RFC6749还有哪些可以完善的? 0.1. 撤销Token 在上篇[认证授权] 1.OAuth2授权中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如何 ...

  7. 性能优化之AJAX

    明天就放假啦~哈哈.四月份好像还没有输出呢,吓得我赶紧写点东西... Ajax是高性能JavaScript的基础. Ajax,从最基本的层面来说,是一种与服务器通信而无需重载页面的方法.数据可以从服务 ...

  8. Spring Boot 学习笔记--整合Redis

    1.新建Spring Boot项目 添加spring-boot-starter-data-redis依赖 <dependency> <groupId>org.springfra ...

  9. NOIP2001T4car的旅行计划

    洛谷传送门 一看数据就是floyed(毕竟年代久远),然而建图不是那么好贱好建,只知道三个机场,需要判断斜边来求第4个机场坐标. 往后一些麻烦的建图. 最后floyed就好. --代码 #includ ...

  10. Java设计模式:工厂模式

    问题提出 Java的工厂模式与现实生活中的工厂的模型是很相似的.工厂是用来做什么?当然是用来生成产品.因此在Java的工厂模式的关键点就是如何描述好产品和工厂这2个角色之间的关系. 下面来仔细描述一下 ...