#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
struct OpeRoom {
int curid;
int state; // 0 - 空闲 1 - 手术中 2 - 手术准备中
int usetime;
int overTime;
}o[11];
struct RecverRoom {
int curid;
int state;// 0 - 空闲 1 - 等待入住 2 - 恢复中 3 -恢复准备中
int usetime;
int overTime;
}r[31];
struct Patient {
int state; // 0 - 等待中 1 - 手术中 2 - 移动 3 - 恢复中 4 - 完毕
int otime;
int rtime;
int rid;
int oid;
int oStime;
int oEtime;
int rStime;
int rEtime;
}p[101];
struct Name {
string name;
}pname[101];
int ocnt, rcnt, pcnt, cur, owait, movet, rwait;
void Init() {
memset(o , 0, sizeof(o ));
memset(r, 0, sizeof(r));
memset(p, 0, sizeof(p));
}
bool IsOver() {
for (int i = 1; i <= pcnt; ++i) {
if(p[i].state == 4)continue;
return false;
}
return true;
}
void RecverClear() {
for (int i = 1; i <= rcnt; ++i) {
if (r[i].state && r[i].overTime <= cur) {
r[i].state = (r[i].state + 1) % 4;
if (r[i].state == 2) {
//手术完毕病人走过来了
int pid = r[i].curid;
r[i].overTime = cur + p[pid].rtime;
r[i].usetime += p[pid].rtime;
}
//恢复完毕
else if (r[i].state == 3) {
//病人结束
p[r[i].curid].state = 4;
//冷却中
r[i].overTime = cur + rwait;
}
}
}
}
void OpeClear() {
int rid = 1,pid = 1;
for (int i = 1; i <= ocnt; ++i) {
if (o[i].state && o[i].overTime <= cur) {
o[i].state = (o[i].state + 1) % 3;
//手术完毕
if (o[i].state == 2) {
pid = o[i].curid;
//手术下轮准备中
o [i].overTime = cur + owait;
//找恢复室
while (rid <= rcnt && r[rid].state != 0) rid++;
if(rid > rcnt) continue;
r[rid].state++;
r[rid].curid = pid;
p[pid].state++;
r[rid].overTime = p[pid].rStime = cur + movet;
p[pid].rEtime = p[pid].rStime + p[pid].rtime;
p[pid].rid = rid;
}
}
}
}
void ReadOpe() {
int oid = 1;
for (int i = 1; i <= pcnt; ++i) {
if(p[i].state) continue;
//找手术室
while (oid <= ocnt && o [oid].state != 0) ++oid;
if (oid > ocnt) return;
o [oid].state++;
o [oid].curid = i;
o [oid].usetime += p[i].otime;
p[i].oEtime = o [oid].overTime = cur + p[i].otime;
p[i].state++;
p[i].oStime = cur;
p[i].oid = oid;
}
}
enum LR {
LEFT = 1,
RIGHT = 0
};
template<typename _Type>
void pFormat(bool left, int width,char f, _Type t) {
cout << (left ? std::left : std::right) << setw(width) << setfill(f) << t;
}
void OutSpace(int cnt) {
for (int i = 0; i < cnt; ++i) cout << ' ';
}
int main()
{
while (cin >> ocnt) {
Init();
cin >> rcnt >> cur >> movet >> owait >> rwait >> pcnt;
cur *= 60;
int basetime = cur;
Init();
for (int i = 1; i <= pcnt; ++i) {
cin >> pname[i].name >> p[i].otime >> p[i].rtime;
}
while (true) {
RecverClear();
if (IsOver())break;
OpeClear();
ReadOpe();
++cur;
}
cout << " Patient Operating Room Recovery Room" << endl;
cout << " # Name Room# Begin End Bed# Begin End" << endl;
cout << " ------------------------------------------------------" << endl;
for (int i = 1; i <= pcnt; ++i) {
pFormat(RIGHT, 2, ' ', i); OutSpace(2);
pFormat(LEFT, 10, ' ', pname[i].name);
pFormat(RIGHT, 2, ' ', p[i].oid); OutSpace(3);
pFormat(RIGHT, 2, ' ', p[i].oStime / 60); cout << ":";
pFormat(RIGHT, 2, '0', p[i].oStime % 60); OutSpace(3);;
pFormat(RIGHT, 2, ' ', p[i].oEtime / 60); cout << ":";
pFormat(RIGHT, 2, '0', p[i].oEtime % 60); OutSpace(5);;
pFormat(RIGHT, 2, ' ', p[i].rid); OutSpace(3);;
pFormat(RIGHT, 2, ' ', p[i].rStime / 60); cout << ":";
pFormat(RIGHT, 2, '0', p[i].rStime % 60); OutSpace(3);;
pFormat(RIGHT, 2, ' ', p[i].rEtime / 60); cout << ":";
pFormat(RIGHT, 2, '0', p[i].rEtime % 60); cout << endl;
}
cout << endl;
cout << "Facility Utilization" << endl;
cout << "Type # Minutes % Used" << endl;
cout << "-------------------------" << endl;
double total = cur - basetime,out = 0;
for (int i = 1; i <= ocnt; ++i) {
cout << "Room ";
pFormat(RIGHT, 2, ' ', i); OutSpace(1);
pFormat(RIGHT, 7, ' ', o [i].usetime); OutSpace(1);
out = 0;
if (cur > basetime) out = o[i].usetime / total * 100;
cout << std::right << setfill(' ') << setw(7) << fixed << setprecision(2) << out << endl;
}
for (int i = 1; i <= rcnt; ++i) {
cout << "Bed ";
pFormat(RIGHT, 2, ' ', i); OutSpace(1);
pFormat(RIGHT, 7, ' ', r[i].usetime); OutSpace(1);
out = 0;
if (cur > basetime) out = r[i].usetime / total * 100;
cout << std::right << setfill(' ') << setw(7) << fixed << setprecision(2) << out << endl;
}
cout << endl;
}
return 0;
}
习题5-16(uva-212)
最新推荐文章于 2022-05-21 19:33:06 发布