【PAT甲级】1026. Table Tennis (30)
来源:互联网 发布:黑客入侵网络考勤机 编辑:程序博客网 时间:2024/05/20 05:23
注:vip顾客面临多桌选择时,优先选择vip球桌。注2:非vip顾客有多桌选择时,选id号最小的球桌。注3:只有vip桌空出来的时候,vip顾客才能插队;非vip球桌空出来时,顾客(包括vip与非vip)中到达最早的先选。
#include <stdio.h>#include <deque>#include <algorithm>#define OPEN_TIME 8 * 3600#define CLOSE_TIME 21 * 3600using namespace std;typedef struct Table { int id; int time; int vip; int serNum;} Table;typedef struct Player { int arrTime; int serTime; int playTime; int waitTime; int vip; bool finished;} Player;void timeConversion (int t, int &h, int &m, int &s);void serve(int s);void serve2(int s);bool pcom(Player a, Player b) { return a.arrTime < b.arrTime;}bool pcom_ser(Player a, Player b) { if (a.serTime < b.serTime) return true; else if (a.serTime == b.serTime && a.arrTime < b.arrTime) return true; return false;}bool tcom(Table a, Table b) { if (a.time < b.time) return true; else if (a.time == b.time && a.vip > b.vip) return true; else if (a.time == b.time && a.vip == b.vip && a.id < b.id) return true; return false;}bool tcom2(Table a, Table b) { if (a.time < b.time) return true; else if (a.time == b.time && a.vip < b.vip) return true; else if (a.time == b.time && a.vip == b.vip && a.id < b.id) return true; return false;}bool tcom_id(Table a, Table b) { return a.id < b.id;}bool tcom_vip_id(Table a, Table b) { if (a.vip > b.vip) return true; else if (a.vip == b.vip && a.id < b.id) return true; return false;}deque<Table> t;Player p[10001];int n, k, m;int main(int argc, char *argv[]) { int i, j; scanf("%d", &n); for (i = 0; i < n; i++) { int h, m, s; scanf("%d:%d:%d %d %d", &h, &m, &s, &p[i].playTime, &p[i].vip); if (p[i].playTime > 120) p[i].playTime = 120;///// p[i].playTime *= 60; p[i].arrTime = h * 3600 + m * 60 + s; p[i].finished = false; p[i].serTime = -1; } sort(p, p + n, pcom); int nn = n; for(i = nn - 1; i >= 0; i--) { if (p[i].arrTime >= CLOSE_TIME) n--; } scanf("%d %d", &k, &m); for (i = 1; i <= k; i++) { Table table; table.id = i; table.vip = 0; table.time = OPEN_TIME; table.serNum = 0; t.push_back(table); } for (i = 0; i < m; i++) { int d; scanf("%d", &d); t[d - 1].vip = 1; } int s = 0; while(s < n) { if (p[s].finished == true) { s++; continue; } sort(t.begin(), t.end(), tcom); if (t.front().time >= CLOSE_TIME) break; int tim = t.front().time; int ptim = p[s].arrTime; int tCount = 0; int pCount = 0; if (tim <= ptim) { for (i = 0; i < t.size() && t[i].time <= ptim; i++); tCount = i; sort(t.begin(), t.begin() + tCount, tcom_vip_id); if (tCount > 1) {//多个桌子可选 if (p[s].vip == 1 && t.front().vip == 1) { serve(s++); } else if (p[s].vip == 1 && t.front().vip == 0) { serve(s++); } else if (p[s].vip == 0 && t.front().vip == 0) { sort(t.begin(), t.begin() + tCount, tcom_id); serve(s++); } else if (p[s].vip == 0 && t.front().vip == 1) { sort(t.begin(), t.begin() + tCount, tcom_id); serve(s++); } } else if (tCount == 1) { serve(s++); } } else if (tim > ptim) { for (i = 0; i < t.size() && t[i].time == tim; i++); tCount = i; if (t.front().vip == 1) { bool hasVip = false; for (i = s; i < n && p[i].arrTime <= tim; i++) { if (p[i].finished == false && p[i].vip == 1) { serve2(i); hasVip = true; p[i].finished = true; break; } } if (!hasVip) { sort(t.begin(), t.begin() + tCount, tcom_id); serve2(s++); } } else if (t.front().vip == 0) { sort(t.begin(), t.begin() + tCount, tcom_id); serve2(s++); } } } sort(p, p + n, pcom_ser); for (i = 0; i < n; i++) { if (p[i].finished == true) { int h, m, s; timeConversion(p[i].arrTime, h, m, s); printf("%02d:%02d:%02d ", h, m, s); timeConversion(p[i].serTime, h, m, s); printf("%02d:%02d:%02d ", h, m, s); printf("%d\n", (p[i].waitTime + 30) / 60); } else continue; } sort(t.begin(), t.end(), tcom_id); for (i = 0; i < t.size(); i++) { printf("%d", t[i].serNum); if (i < t.size() - 1) printf(" "); else printf("\n"); } return 0;}void timeConversion (int t, int &h, int &m, int &s) { h = t / 3600; m = t % 3600 / 60; s = t % 3600 % 60;}void serve(int s) { p[s].serTime = p[s].arrTime; p[s].waitTime = 0; p[s].finished = true; t.front().time = p[s].arrTime + p[s].playTime; t.front().serNum++;}void serve2(int s) { p[s].serTime = t.front().time; p[s].waitTime = t.front().time - p[s].arrTime; p[s].finished = true; t.front().time += p[s].playTime; t.front().serNum++;}
0 0
- 【PAT甲级】1026. Table Tennis (30)
- PAT甲级1026. Table Tennis (30)
- PAT 甲级 1026. Table Tennis (30)
- 1026. Table Tennis (30)-PAT甲级真题(模拟)
- PAT甲级练习1026. Table Tennis (30)-未完成
- PAT 1026. Table Tennis (30)
- 1026. Table Tennis (30)-PAT
- PAT 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)
- pat 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)
- PAT 甲级 1026 Table Tennis(模拟)
- PAT 1026. Table Tennis
- 【PAT】1026. Table Tennis
- PAT 1026. Table Tennis (30) 【26/30】
- PAT A 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)(待修改)
- 【PAT】【Advanced Level】1026. Table Tennis (30)
- cocoaPods 最新安装方式
- 多线程相关
- 352_Socket文件上传
- java 带有包名编译并运行,附带外部依赖jar包运行
- 词组缩写
- 【PAT甲级】1026. Table Tennis (30)
- B-JUI1.3终于发布了,升不升级都是问题
- 353_SparseArray解析
- ECMAScript 类型转换
- 并行,并发和锁的问题
- 组合数求模
- 161019
- WebService的两种客户端调用方式
- 354_出现乱码