记录一下个人遇到的错误点:
1、play_time最大为2h
2、servetime>=13*3600 的都不予办理
3、当vip pair到达时,若有多个空闲的桌子,优先选择其中的vip桌
#include#include #include #include using namespace std; struct pairs{ int play_time = 0; int arrive = 0; int serve = 0; int vip = 0; int isvisited = 0; }; struct table { int vip = 0; int count = 0; int endtime = 0; }; bool compareArrive(struct pairs p1, struct pairs p2) { return p1.arrive< p2.arrive; } bool compareServe(struct pairs p1, struct pairs p2) { return p1.serve < p2.serve; } vector info; vector t; int findNextVIP(int i,int N) { int index; for (int j = i; j < N; j++) { if (info[j].vip == 1 && info[j].isvisited==0) return j; } return -1; } int findFirstTable(int K) { int min = t[1].endtime; int index = 1; for (int i = 2; i <= K; i++) { if (t[i].endtime < min) { min = t[i].endtime; index = i; } } return index; } void allocate(int p_index, int t_index) { int flag = 1; info[p_index].isvisited = 1; if (info[p_index].arrive < t[t_index].endtime) { info[p_index].serve = t[t_index].endtime; t[t_index].endtime += info[p_index].play_time*60; } else { if (info[p_index].vip == 1) { int k; for (k = 1; k <= t.size(); k++) { if (info[p_index].arrive >= t[k].endtime && t[k].vip == 1) break; } if (k != t.size() + 1) { t_index = k; flag = 0; } } if (flag == 1) { for (int k = 1; k <= t.size(); k++) { if (info[p_index].arrive > t[k].endtime) { t_index = k; break; } } } info[p_index].serve = info[p_index].arrive; t[t_index].endtime = info[p_index].serve + info[p_index].play_time*60; } if(info[p_index].serve<13*3600) t[t_index].count++; } int main() { int N; cin >> N; info.resize(N); for (int i = 0; i < N; i++) { int h, m, s; scanf("%02d:%02d:%02d", &h, &m, &s); cin >> info[i].play_time; if (info[i].play_time > 2 * 60) info[i].play_time = 2 * 60; cin >> info[i].vip; info[i].arrive = h * 3600 + m*60 + s-8*3600; } int K, M;cin >> K >> M; t.resize(K+1); for (int i = 1; i <= M; i++) { int temp; cin >> temp; t[temp].vip = 1; } sort(info.begin(), info.end(), compareArrive); for (int i = 0; i < N; i++) { if (info[i].isvisited == 1) continue; while (info[i].isvisited == 0) { int m = findFirstTable(K); if (t[m].vip == 1) { int v = findNextVIP(i, N); if (v == -1) { allocate(i, m); continue; } if (info[v].arrive <= t[m].endtime) allocate(v, m); else allocate(i, m); } else allocate(i, m); } } sort(info.begin(), info.end(), compareServe); for (int i = 0; i < N; i++) { if (info[i].serve >= 13 * 3600) break; int h, m, s; h = info[i].arrive / 3600; m = (info[i].arrive - h * 3600) / 60; s = info[i].arrive % 60; printf("%02d:%02d:%02d ", h + 8, m, s); h = info[i].serve / 3600; m = (info[i].serve - h * 3600) / 60; s = info[i].serve % 60; printf("%02d:%02d:%02d ", h + 8, m, s); int wait = info[i].serve - info[i].arrive; wait = (wait % 60 >= 30) ? wait / 60 + 1 : wait / 60; cout << wait << endl; } for (int i = 1; i <= K; i++) { cout << t[i].count; if (i != K) cout << " "; } return 0; }



