Advertisement
Emiliatan

UVa 212

Jan 23rd, 2020
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.63 KB | None | 0 0
  1. /* UVa 212 */
  2.  
  3. #pragma warning( disable : 4996 )
  4. /*
  5. #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
  6. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  7. #pragma comment(linker, "/stack:200000000")
  8. #pragma GCC optimize("O3")
  9. */
  10. //#include <bits/stdc++.h>
  11. #include <cstdio>
  12. #include <cstring>
  13. #include <climits>
  14. #include <cmath>
  15. #include <algorithm>
  16. #include <cassert>
  17. #include <tuple>
  18. #define ios_jazz ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
  19. #define FOR(i, l, r) for (int i = (l); i < (r); ++i)
  20. #define FORR(i, r, l) for (int i =(r); i >= (l); --i)
  21. #define P(STR) puts(#STR)
  22.  
  23. using namespace std;
  24.  
  25. constexpr int Dir4[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
  26. constexpr int Dir8[8][2] = { {-1, -1}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 1} };
  27. constexpr double EPS = 1e-8;
  28. const double PI = acos(-1);
  29.  
  30. using int16 = short;
  31. using uint16 = unsigned short;
  32. using uint = unsigned int;
  33. using int64 = long long;
  34. using uint64 = unsigned long long;
  35. using pii = pair<int, int>;
  36.  
  37. auto Equal = [](double a, double b) { return fabs(a - b) < EPS; };
  38.  
  39. /* mods */
  40.  
  41. /* main code */
  42. #include <map>
  43. #include <queue>
  44. #include <string>
  45. #include <iostream>
  46.  
  47. constexpr int MAXPATNUM = 100;
  48.  
  49. int num_oper, num_recr, stclock, trans_time, prepareOp_time, prepareRe_time, patnum;
  50. map<string, int> nameTonum;
  51. map<int, string> numToname;
  52.  
  53. enum {inQueue, inOper, Wait, inRecr, Done};
  54. struct patient
  55. {
  56.     int id, op_begin, op_end, re_begin, re_end;
  57.     int room, bed;
  58.     int req_op, req_re;
  59.     int state;
  60.  
  61.     patient() = default;
  62.     patient(int id, int reqo, int reqr, int st) :id(id), req_op(reqo), req_re(reqr), state(st) {};
  63. };
  64.  
  65. patient patData[MAXPATNUM + 1];
  66. int oper[11]{};
  67. int operCD[11];
  68. int oper_usetime[11]{};
  69. int recr[31]{};
  70. int recrCD[31];
  71. int recr_usetime[31]{};
  72.  
  73. bool isAllDnoe()
  74. {
  75.     bool Ok = true;
  76.     FOR(i, 1, patnum + 1)
  77.         Ok &= (patData[i].state == Done);
  78.     return Ok;
  79. }
  80.  
  81. priority_queue<pii, vector<pii>, greater<pii> > recover_queue;
  82. int nowT = 0;
  83.  
  84. void init()
  85. {
  86.     nowT = 0;
  87.  
  88.     memset(oper, 0, sizeof(oper));
  89.     memset(operCD, 0, sizeof(operCD));
  90.     memset(oper_usetime, 0, sizeof(oper_usetime));
  91.     memset(recr, 0, sizeof(recr));
  92.     memset(recrCD, 0, sizeof(recrCD));
  93.     memset(recr_usetime, 0, sizeof(recr_usetime));
  94.  
  95.     recover_queue = priority_queue<pii, vector<pii>, greater<pii> >();
  96.     nameTonum.clear();
  97.     numToname.clear();
  98. }
  99.  
  100. int main()
  101. {
  102.     //ios_jazz;
  103.  
  104.     while (cin >> num_oper >> num_recr >> stclock >> trans_time >> prepareOp_time >> prepareRe_time >> patnum)
  105.     {
  106.         init();
  107.  
  108.         FOR(id, 1, patnum + 1)
  109.         {
  110.             string name;
  111.             int req_op, req_re;
  112.  
  113.             cin >> name;
  114.             nameTonum[name] = id;
  115.             numToname[id] = name;
  116.  
  117.             cin >> req_op >> req_re;
  118.             patData[id] = patient(id, req_op, req_re, inQueue);
  119.         }
  120.  
  121.         while (not isAllDnoe())
  122.         {
  123.             FOR(i, 1, num_oper + 1)
  124.                 if (oper[i] == 0 && operCD[i] <= nowT)
  125.                 {
  126.                     FOR(j, 1, patnum + 1)
  127.                         if (patData[j].state == inQueue)
  128.                         {
  129.                             oper[i] = patData[j].id;
  130.                             oper_usetime[i] += patData[j].req_op;
  131.  
  132.                             patData[j].state = inOper;
  133.                             patData[j].op_begin = nowT;
  134.                             patData[j].op_end = nowT + patData[j].req_op;
  135.                             patData[j].room = i;
  136.                             break;
  137.                         }
  138.                 }
  139.                 else
  140.                 {
  141.                     int id = oper[i];
  142.  
  143.                     if (patData[id].op_end == nowT)
  144.                     {
  145.                         recover_queue.emplace(i, id);
  146.  
  147.                         patData[id].state = Wait;
  148.                         patData[id].re_begin = nowT + trans_time;
  149.                         patData[id].re_end = patData[id].re_begin + patData[id].req_re;
  150.  
  151.                         operCD[i] = nowT + prepareOp_time;
  152.                         oper[i] = 0;
  153.                     }
  154.                 }
  155.  
  156.             FOR(i, 1, num_recr + 1)
  157.             {
  158.                 if (recr[i] == 0 && recrCD[i] <= nowT)
  159.                 {
  160.                     if (recover_queue.empty()) continue;
  161.                     int id = recover_queue.top().second; recover_queue.pop();
  162.  
  163.                     recr[i] = id;
  164.                     recr_usetime[i] += patData[id].req_re;
  165.  
  166.                     assert(patData[id].state == Wait);
  167.  
  168.                     patData[id].state = inRecr;
  169.                     patData[id].bed = i;
  170.                 }
  171.                 else
  172.                 {
  173.                     int id = recr[i];
  174.  
  175.                     if (patData[id].re_end == nowT)
  176.                     {
  177.                         patData[id].state = Done;
  178.  
  179.                         recrCD[i] = nowT + prepareRe_time;
  180.                         recr[i] = 0;
  181.                     }
  182.                 }
  183.             }
  184.             assert(recover_queue.empty());
  185.  
  186.             ++nowT;
  187.         }
  188.  
  189.         auto convertTime = [=](int t) -> pii {
  190.             int hour = stclock;
  191.             int min = t;
  192.             hour += min / 60;
  193.             min %= 60;
  194.             return { hour, min };
  195.         };
  196.  
  197. #define br cout << '\n';
  198.  
  199.         cout << " Patient          Operating Room          Recovery Room" << '\n';
  200.         cout << " #  Name     Room#  Begin   End      Bed#  Begin    End" << '\n';
  201.         cout << " ------------------------------------------------------" << '\n';
  202.  
  203.         FOR(i, 1, patnum + 1)
  204.         {
  205.             pii roombeg, bedbeg, roomend, bedend;
  206.             int room, bed;
  207.  
  208.             roombeg = convertTime(patData[i].op_begin);
  209.             bedbeg = convertTime(patData[i].re_begin);
  210.             roomend = convertTime(patData[i].op_end);
  211.             bedend = convertTime(patData[i].re_end);
  212.             room = patData[i].room, bed = patData[i].bed;
  213.  
  214.             printf("%2d  %-9s %2d  %3d:%02d  %3d:%02d    %3d  %3d:%02d  %3d:%02d\n", i, numToname[i].c_str(), room, roombeg.first, roombeg.second, roomend.first, roomend.second, bed, bedbeg.first, bedbeg.second, bedend.first, bedend.second);
  215.  
  216.         }
  217.         br;
  218.  
  219.         --nowT;
  220.         cout << "Facility Utilization" << '\n';
  221.         cout << "Type  # Minutes  % Used" << '\n';
  222.         cout << "-------------------------" << '\n';
  223.         FOR(i, 1, num_oper + 1)
  224.         {
  225.             printf("%-4s %2d %7d %7.2lf\n", "Room", i, oper_usetime[i], (double)oper_usetime[i] * 100 / fabs(nowT));
  226.         }
  227.         FOR(i, 1, num_recr + 1)
  228.         {
  229.             printf("%-4s %2d %7d %7.2lf\n", "Bed", i, recr_usetime[i], (double)recr_usetime[i] * 100 / fabs(nowT));
  230.         }
  231.         br;
  232.     }
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement