Skip to content

Commit

Permalink
Update 1026. Table Tennis (30) .cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
liuchuo committed Aug 18, 2022
1 parent 4befd15 commit e330a34
Showing 1 changed file with 46 additions and 105 deletions.
151 changes: 46 additions & 105 deletions AdvancedLevel_C++/1026. Table Tennis (30) .cpp
Original file line number Diff line number Diff line change
@@ -1,119 +1,60 @@
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
struct person {
int arrive, start, time;
bool vip;
}tempperson;
struct tablenode {
int end = 8 * 3600, num;
bool vip;
};
bool cmp1(person a, person b) {
return a.arrive < b.arrive;
}
bool cmp2(person a, person b) {
return a.start < b.start;
}
vector<person> player;
vector<tablenode> table;
void alloctable(int personid, int tableid) {
if(player[personid].arrive <= table[tableid].end)
player[personid].start = table[tableid].end;
else
player[personid].start = player[personid].arrive;
table[tableid].end = player[personid].start + player[personid].time;
table[tableid].num++;
}
int findnextvip(int vipid) {
vipid++;
while(vipid < player.size() && player[vipid].vip == false) vipid++;
return vipid;
}
int n, m, k, H, M, S, t, table, vtable, cnt, now, nowt, T[100000], V[100000], num[10001], AnsI[10001], AnsO[10001], vip[10001];
map<int, int> Table;
queue<int> Wait, vWait;
int main() {
int n, k, m, viptable;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
int h, m, s, temptime, flag;
scanf("%d:%d:%d %d %d", &h, &m, &s, &temptime, &flag);
tempperson.arrive = h * 3600 + m * 60 + s;
tempperson.start = 21 * 3600;
if(tempperson.arrive >= 21 * 3600) continue;
tempperson.time = temptime <= 120 ? temptime * 60 : 7200;
tempperson.vip = ((flag == 1) ? true : false);
player.push_back(tempperson);
for (int i = 0; i < n; i++) {
scanf("%d:%d:%d", &H, &M, &S);
t = H * 3600 + M * 60 + S;
scanf("%d %d", &T[t], &V[t]);
T[t] = min(T[t], 120) * 60;
}
scanf("%d%d", &k, &m);
table.resize(k + 1);
for(int i = 0; i < m; i++) {
scanf("%d", &viptable);
table[viptable].vip = true;
scanf("%d %d", &m, &k);
for (int i = 0; i < k; i++) {
scanf("%d", &t);
vip[t] = 1;
}
sort(player.begin(), player.end(), cmp1);
int i = 0, vipid = -1;
vipid = findnextvip(vipid);
while(i < player.size()) {
int index = -1, minendtime = 999999999;
for(int j = 1; j <= k; j++) {
if(table[j].end < minendtime) {
minendtime = table[j].end;
index = j;
}
}
if(table[index].end >= 21 * 3600) break;
if(player[i].vip == true && i < vipid) {
i++;
continue;
for (int Time = 28800; Time < 75600; Time++, table = vtable = now = 0) {
if (T[Time] && V[Time]) vWait.push(Time);
else if (T[Time]) Wait.push(Time);
for (int i = 1; i <= m; i++) {
if (Table[i] > 0) Table[i]--;
if (Table[i] == 0 && vip[i] && vtable == 0) vtable = i;
if (Table [i] == 0 && table == 0) table = i;
}
if(table[index].vip == true) {
if(player[i].vip == true) {
alloctable(i, index);
if(vipid == i) vipid = findnextvip(vipid);
i++;
} else {
if(vipid < player.size() && player[vipid].arrive <= table[index].end) {
alloctable(vipid, index);
vipid = findnextvip(vipid);
} else {
alloctable(i, index);
i++;
}
}
} else {
if(player[i].vip == false) {
alloctable(i, index);
i++;
} else {
int vipindex = -1, minvipendtime = 999999999;
for(int j = 1; j <= k; j++) {
if(table[j].vip == true && table[j].end < minvipendtime) {
minvipendtime = table[j].end;
vipindex = j;
}
}
if(vipindex != -1 && player[i].arrive >= table[vipindex].end) {
alloctable(i, vipindex);
if(vipid == i) vipid = findnextvip(vipid);
i++;
} else {
alloctable(i, index);
if(vipid == i) vipid = findnextvip(vipid);
i++;
}
if (!vWait.empty() && (table || vtable)) {
now = vWait.front();
nowt = vtable;
if (vtable != 0) vWait.pop();
else {
nowt = table;
if (!Wait.empty() && Wait.front() < vWait.front()) {
now = Wait.front();
Wait.pop();
} else vWait.pop();
}
} else if (!Wait.empty() && (table || vtable)) {
if (table != 0) nowt = table;
else nowt = vtable;
now = Wait.front();
Wait.pop();
}
if (now == 0) continue;
Table[nowt] = T[now];
AnsI[cnt] = now;
AnsO[cnt++] = Time;
num[nowt]++;
}
sort(player.begin(), player.end(), cmp2);
for(i = 0; i < player.size() && player[i].start < 21 * 3600; i++) {
printf("%02d:%02d:%02d ", player[i].arrive / 3600, player[i].arrive % 3600 / 60, player[i].arrive % 60);
printf("%02d:%02d:%02d ", player[i].start / 3600, player[i].start % 3600 / 60, player[i].start % 60);
printf("%.0f\n", round((player[i].start - player[i].arrive) / 60.0));
}
for(int i = 1; i <= k; i++) {
if(i != 1) printf(" ");
printf("%d", table[i].num);
for (int i = 0; i < cnt; i++)
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n", AnsI[i] / 3600, AnsI[i] % 3600 / 60, AnsI[i] % 60, AnsO[i] / 3600, AnsO[i] % 3600 / 60, AnsO[i] % 60, (AnsO[i] - AnsI[i] + 30) / 60);
for (int i = 1; i <= m; i++) {
if (i != 1) printf(" ");
printf("%d", num[i]);
}
return 0;
}

0 comments on commit e330a34

Please sign in to comment.