原题链接

一个乒乓球俱乐部共有 K 张乒乓球台,编号为 1∼K。

对于任意一对球员,当他们到达时如果有多个球台可用,那么他们就会被安排到编号较小的那个球台上打球。

如果所有球台都被占用了,他们就只能排队等待了。

假设每对球员最多只允许打两小时球。

你需要计算每个排队等候的人的等待时间以及每个球台当天有多少对球员在上面打球。

另外,让这个事情变得复杂的是,俱乐部为 VIP 球员保留了一些球台。

当一个 VIP 球台空出时,等待队伍中的第一对 VIP 球员将优先使用这个球台。

如果此时等待队伍中没有 VIP,则排在等待队伍的第一对球员可以使用这个球台。

另一方面,当轮到一对 VIP 球员打球时,如果没有 VIP 球台可用,那么他们将被视作普通球员处理。

补充:
1、当等待队伍中有 VIP 球员并且有空闲 VIP 球台时,必须优先分配 VIP 球员,并且必须分配他们 VIP 球台(优先分配编号较小的),直至 VIP 用户或 VIP 球台分配完为止。
2、期望打球时间超过两小时的,只能允许打两小时。
3、当多对球员的开始打球时间相同时,先输出到达时间早的球员的信息。
4、当等待球员中没有 VIP 时,VIP 球台视作普通球台处理,当可用球台中没有 VIP 球台时,VIP 球员视作普通球员处理。

输入格式
第一行包含整数 N,表示共有 N 对球员。

接下来 N 行,每行包含两个时间以及一个 VIP 标识,HH:MM:SS----到达时间,p----打球时间(单位:分钟),tag----如果是 1,说明这是一对 VIP,如果是 0,说明不是 VIP。

保证到达时间在 08:00:00 至 21:00:00 之间,这是俱乐部的营业时间。

保证每对球员的到达时间都不相同。

再一行包含两个整数 K 和 M,表示球台数量以及 VIP 球台数量。

最后一行包含 M 个整数,表示 VIP 球台的编号。

输出格式
首先输出每对球员的到达时间,开始打球时间,等待时间。

每对球员的信息占一行,按开始打球时间从早到晚的顺序依次输出。

等待时间必须四舍五入为整数分钟。

如果一对球员在 21:00:00 之前(不包括 21:00:00)不能得到一张球台,那么无需输出他们的信息。

再输出一行,K 个整数,表示每个球台服务的球员对数。

数据范围
1≤N≤10000,
1≤K≤100,
0≤M≤K
输入样例:
9
20:52:00 10 0
08:00:00 20 0
08:02:00 30 0
20:51:00 10 0
08:10:00 5 0
08:12:00 10 1
20:50:00 10 0
08:01:30 15 1
20:53:00 10 1
3 1
2
输出样例:
08:00:00 08:00:00 0
08:01:30 08:01:30 0
08:02:00 08:02:00 0
08:12:00 08:16:30 5
08:10:00 08:20:00 10
20:50:00 20:50:00 0
20:51:00 20:51:00 0
20:52:00 20:52:00 0
3 3 2

我的解法:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>using namespace std;const int N = 10010, M = 110, INF = 1000000;int n, k, m;struct Person  // 球员
{int arrive_time, play_time;int start_time, waiting_time;bool operator< (const Person& t) const  // sort排序{if (start_time != t.start_time) return start_time < t.start_time;return arrive_time < t.arrive_time;}bool operator> (const Person& t) const  // 优先队列中比较大小{return arrive_time > t.arrive_time;}
};struct Table  // 球桌
{int id;int end_time;bool operator> (const Table& t) const  // 优先队列中比较大小{if (end_time != t.end_time) return end_time > t.end_time;return id > t.id;}
};bool is_vip_table[M];
int table_cnt[M];vector<Person> persons;void assign(priority_queue<Person, vector<Person>, greater<Person>>& ps,priority_queue<Table, vector<Table>, greater<Table>>& ts)
{auto p = ps.top(); ps.pop();auto t = ts.top(); ts.pop();p.waiting_time = round((t.end_time - p.arrive_time) / 60.0);p.start_time = t.end_time;table_cnt[t.id] ++ ;persons.push_back(p);ts.push({t.id, t.end_time + p.play_time});
}string get_time(int secs)
{char str[20];sprintf(str, "%02d:%02d:%02d", secs / 3600, secs % 3600 / 60, secs % 60);return str;
}int main()
{cin >> n;priority_queue<Person, vector<Person>, greater<Person>> normal_persons;priority_queue<Person, vector<Person>, greater<Person>> vip_persons;normal_persons.push({INF});vip_persons.push({INF});for (int i = 0; i < n; i ++ ){int hour, minute, second;int play_time, is_vip;scanf("%d:%d:%d %d %d", &hour, &minute, &second, &play_time, &is_vip);int secs = hour * 3600 + minute * 60 + second;play_time = min(play_time, 120);play_time *= 60;if (is_vip) vip_persons.push({secs, play_time});else normal_persons.push({secs, play_time});}priority_queue<Table, vector<Table>, greater<Table>> normal_tables;priority_queue<Table, vector<Table>, greater<Table>> vip_tables;normal_tables.push({-1, INF});vip_tables.push({-1, INF});cin >> k >> m;for (int i = 0; i < m; i ++ ){int id;cin >> id;is_vip_table[id] = true;}for (int i = 1; i <= k; i ++ )if (is_vip_table[i]) vip_tables.push({i, 8 * 3600});else normal_tables.push({i, 8 * 3600});while (normal_persons.size() > 1 || vip_persons.size() > 1){auto np = normal_persons.top();auto vp = vip_persons.top();int arrive_time = min(np.arrive_time, vp.arrive_time);while (normal_tables.top().end_time < arrive_time)  // O(klogk){auto t = normal_tables.top();normal_tables.pop();t.end_time = arrive_time;normal_tables.push(t);}while (vip_tables.top().end_time < arrive_time){auto t = vip_tables.top();vip_tables.pop();t.end_time = arrive_time;vip_tables.push(t);}auto nt = normal_tables.top();auto vt = vip_tables.top();int end_time = min(nt.end_time, vt.end_time);if (end_time >= 21 * 3600) break;if (vp.arrive_time <= end_time && vt.end_time == end_time) assign(vip_persons, vip_tables);else if (np.arrive_time < vp.arrive_time){if (nt > vt) assign(normal_persons, vip_tables);else assign(normal_persons, normal_tables);}else{if (nt > vt) assign(vip_persons, vip_tables);else assign(vip_persons, normal_tables);}}sort(persons.begin(), persons.end());for (auto person : persons){cout << get_time(person.arrive_time) << ' ' << get_time(person.start_time) << ' ';cout << person.waiting_time << endl;}cout << table_cnt[1];for (int i = 2; i <= k; i ++ ) cout << ' ' << table_cnt[i];cout << endl;return 0;
}

PAT甲级 1026 乒乓球相关推荐

  1. PAT甲级题目对应知识点分类梳理

    PAT甲级的106道题的知识点与对应的题号整理如下,便于做专项练习和巩固! 1.数据结构 可以用STL系列 栈:1051 堆:1098 队列:1014.1056 链表:1032.1052.1074.1 ...

  2. PAT甲级考试题库题目分类

    PAT甲级题目分类 水题 1136.1139.1143.1148 字符串处理 1001.1005.1035.1061.1073.1077.1082. 1108.1140.1152 模拟 1002.10 ...

  3. PAT甲级真题目录(按题型整理)(转自柳神)

    转载自:https://www.liuchuo.net/archives/2502?tdsourcetag=s_pcqq_aiomsg 最短路径 1003. Emergency (25)-PAT甲级真 ...

  4. PAT甲级训练合集(1-70)

    本章题解跳转 考点 P1001 数字的数组表示和处理 P1002 多项式的数组表示和处理 P1003 深度优先搜素 P1004 深度优先搜素 P1005 哈希表 P1006 P1007 数组子区间求和 ...

  5. PAT甲级题目解析和知识点分类整理

    转载请注明出处 个人博客:https://maxusun.github.io/ 今天整理电脑,发现了去年为了考研浙大计算机整理的PAT资料.现在考研已经尘埃落定.想到当时盲目刷题浪费了好多时间,在这里 ...

  6. PAT甲级(Advanced Level)真题--1046 Sharing

    PAT甲级(Advanced Level)真题–1046 Sharing 通过:648 提交:1138 通过率:56% To store English words, one method is to ...

  7. PAT甲级(Advanced Level)真题-- 1062 To Buy or Not to Buy

    PAT甲级(Advanced Level)真题-- 1062 To Buy or Not to Buy 通过:643 提交:1220 通过率:52% Eva would like to make a ...

  8. PAT甲级真题 1018 A+B in Hogwarts--python解法

    PAT甲级真题 1018 A+B in Hogwarts 提交:2638 通过:1559 通过率:59% If you are a fan of Harry Potter, you would kno ...

  9. Pat甲级 1002 A+B for Polynomials

    Pat甲级 1002 A+B for Polynomials 思路 代码 题目网址 https://pintia.cn/problem-sets/994805342720868352/problems ...

最新文章

  1. python经典题库和答案_吐血总结,Python经典面试题及答案
  2. Klockwork告警常见错误
  3. 文献记录(part60)--高维模型选择方法综述
  4. 数学--数论--HDU-2698 Maximum Multiple(规律)
  5. windows平台下基于QT和OpenCV搭建图像处理平台
  6. linux后台启动脚本nohup,linux下后台执行shell脚本nohup
  7. python编程画布_Python Tkinter 画布(Canvas)
  8. Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
  9. matlab的图像滤波,Matlab实现图像滤波
  10. 我的2017OKR - 年中回顾
  11. 毕业论文系列-公式编号-等号对齐及编号
  12. python 爬虫框架scrapy优势_Python 爬虫框架Scrapy 简单介绍
  13. 更改不了html的默认程序,解决烦人的Windows10系统无法更改默认应用程序的怪问题...
  14. 【python初学者日记】输入年份:判断是否闰年:闰年:yyyy是闰年,这年有366天;yyyy是平年,这年有365天
  15. 如何修改Adobe Acrobat身份信息中的登录名
  16. 微信怎么关闭wifi定位服务器,WiFi定位到底怎么做的,看完这个你就知道了
  17. 如何防护 DDoS 攻击?
  18. python---控制时间的函数time()
  19. 戴尔服务器t420系统,戴尔PowerEdge T420
  20. python字典题_python列表、字典相关练习题

热门文章

  1. EasyCrawler-Post请求之爬个优衣库
  2. Espressif IDE 及其 v2.4.0 新增功能—第一部分
  3. 专业名词(ADAS)
  4. OSChina 周六乱弹 ——胸会压到键盘
  5. 银河麒麟系统Arm64 编译Gdal
  6. 个性字体设计遵循原则
  7. ONAP — 系统架构
  8. error: src refspec test does not match any.
  9. 可行性分析报告-机房收费系统
  10. 天气预报系统中的可视化