1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| #include <bits/stdc++.h> using namespace std; #define mp2 make_pair #define mp(x, y, z) mp2(mp2(x, y), z) const char inform[6][128] = {"%02d:%02d The elevator starts to move up from floor %d.\n", "%02d:%02d The elevator starts to move down from floor %d.\n", "%02d:%02d The elevator stops at floor %d.\n", "%02d:%02d %d people leave the elevator.\n", "%02d:%02d %d people enter the elevator.\n"}; struct reques { int t, s, d; reques(int t = 0, int s = 0, int d = 0): t(t), s(s), d(d) {} }a[110]; struct elevator { bool is_free, is_run; int floor, direc; list<reques> ren; elevator() { is_free = true; floor = direc = 0; is_run = false; } }elev; list<reques> quer[110]; int k, n, p; int tim; int solvednum; bool checkend() { return solvednum == n; } int main() { scanf("%d%d%d", &k, &n, &p); elev.floor = k; for (int i = 1; i <= n; ++i) { scanf("%d%d%d", &a[i].t, &a[i].s, &a[i].d); } int qq = 1; while (!checkend()) { while (qq <= n && a[qq].t == tim) { quer[a[qq].s].emplace_back(a[qq]); ++qq; } if (elev.is_free) { vector<reques> q; for (int i = 1; i <= 100; ++i) { for (auto j : quer[i]) q.emplace_back(j); } if (q.empty()) goto nxt; sort(q.begin(), q.end(), [&](auto x, auto y){return mp(x.t, (x.s != elev.floor), x.s == elev.floor? x.s > x.d : x.s < elev.floor) < mp(y.t, (y.s != elev.floor), y.s == elev.floor? y.s > y.d : y.s < elev.floor);}); elev.is_free = false; elev.direc = (q.front().s == elev.floor ? (q.front().d > q.front().s ? 1 : -1) : (q.front().s > elev.floor ? 1 : -1)); } nxt: if (!elev.is_free) { int numxdt = 0; for (auto i : elev.ren) { if (i.d == elev.floor) { ++numxdt; } } if (numxdt) { if (elev.is_run) { elev.is_run = false; printf(inform[2], tim / 60, tim % 60, elev.floor); } printf(inform[3], tim / 60, tim % 60, numxdt); for (auto i = elev.ren.begin(); i != elev.ren.end();) { if (i -> d == elev.floor) { i = elev.ren.erase(i); } else { ++i; } } solvednum += numxdt; goto ed; } int sdt = 0; for (auto i : quer[elev.floor]) { if ((i.d - i.s) * elev.direc > 0) ++sdt; } if ((int)elev.ren.size() < p && sdt) { sdt = min(sdt, p - (int)elev.ren.size()); if (elev.is_run) { elev.is_run = false; printf(inform[2], tim / 60, tim % 60, elev.floor); } printf(inform[4], tim / 60, tim % 60, sdt); for (auto i = quer[elev.floor].begin(); i != quer[elev.floor].end() && sdt;) { if ((i -> d - i -> s) * elev.direc > 0) { elev.ren.emplace_back(*i); i = quer[elev.floor].erase(i); --sdt; } else { ++i; } } goto ed; } if (!elev.is_run) { if (elev.direc > 0) { printf(inform[0], tim / 60, tim % 60, elev.floor); } else { printf(inform[1], tim / 60, tim % 60, elev.floor); } } elev.is_run = 1; elev.floor += elev.direc; } ed: if (!elev.is_free) { bool flg = 0; for (int i = elev.floor + elev.direc; i > 0 && i <= 100; i += elev.direc) { if (quer[i].size()) { flg = 1; break; } } if (!flg) for (auto i : quer[elev.floor]) { if ((i.d - i.s) * elev.direc > 0 && (int)elev.ren.size() < p) { flg = 1; break; } } if (!elev.ren.size() && !flg) { elev.direc = -elev.direc; flg = 0; for (int i = 1; i <= 100; ++i) { if (quer[i].size()) { flg = 1; break; } } if (!flg) elev.is_free = 1; } } ++tim; } return 0; }
|