PAT甲级1026 Table Tennis【模拟好题】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805472333250560
题意:
有k张乒乓球桌,有的是vip桌。有n对玩家来打乒乓,有的玩家是VIP玩家。
当他们到达时,如果没有空桌子他们就排队等待。
这时候如果有VIP桌子空出来了,那么就优先给队列里的VIP玩家,如果没有VIP玩家就给普通玩家。
如果普通桌子空出来了,就给队列里排在最前的玩家。
如果玩家到达的时候有好多桌子可以选择,那么他会选择桌号最小的那张,VIP玩家会优先选择桌号最小的VIP桌子【这题意真的....】。
每对玩家最多只能玩两个小时。
营业时间是上午八点到晚上九点。如果在晚上九点还没开始玩就不能玩了。
最后输出每对玩家到达时间,开始玩的时间和(四舍五入后的)等待时间。
思路:
我好菜系列。PAT真是练模拟的好地方。
首先根据输入把时间按照秒预处理。然后把所有玩的时间超过2小时的设置为2小时。
建两个玩家队列,把VIP玩家和非VIP玩家分开,分别遍历直到两个队列都为空。
对于队首的VIP玩家和非VIP玩家我们先根据他们到达的最早时间找到一张合法的桌子(不管是VIP桌还是非VIP桌)table1
然后我们再根据VIP玩家到达的时间找到桌号最小的VIP桌。table2
找的过程是:如果当前桌子的结束时间小于当前时间,那么break,如果找不到小于的就要在大于之中找到结束时间最早的一张桌子。
之后我们判断到底是VIP玩家先玩还是非VIP玩家先玩。
如果非VIP到的比VIP早,并且table1的结束时间比VIP到达的早,那么非VIP先玩。
如果非VIP到的比VIP早,并且table1不是VIP桌,那么非VIP也先玩。
否则就是VIP先玩。
如果是VIP先玩,那么他应该要选择合法的桌号最小的VIP桌,也就是table2
然后更新这对玩家的时间还有桌子的结束时间和数量。根据是谁玩的,决定是哪个队列的下标+1.
由于有的玩家玩不到了,所以每对玩家还需要用一个vis标记是否玩了。
四舍五入可以适用round()函数。
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr; int n;
const int maxn = 1e4 + ;
int k, m;
int cnt[]; struct player{
int id;
int arrive_time;
int play_time;
bool vip;
int serve_time = ;
int wait;
bool can = false;
}peo[maxn]; struct table{
int id;
int finish_time = ;
bool vip = false;
bool operator < (table b)const{
if(finish_time == b.finish_time)return id > b.id;
return finish_time > b.finish_time;
}
}tab[]; bool cmp(player a, player b)
{
return a.arrive_time < b.arrive_time;
} bool cmp1(player a, player b)
{
return a.arrive_time + a.wait < b.arrive_time + b.wait;
} int findd(int t, int type)
{
int ret = , ans = ;
for(int i = ; i <= k; i++){
if(type && !tab[i].vip)continue;
if(tab[i].finish_time < t){
ans = i;
break;
}
else if(tab[i].finish_time < ret){
ans = i;
ret = tab[i].finish_time;
}
}
return ans;
} vector<player>que[];
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++){
int h, m, s;
peo[i].id = i;
scanf("%d:%d:%d %d %d", &h, &m, &s, &peo[i].play_time, &peo[i].vip);
peo[i].arrive_time = (h - ) * * + m * + s;
if(peo[i].play_time > )peo[i].play_time = ;
peo[i].play_time *= ;
que[peo[i].vip].push_back(peo[i]);
}
peo[n + ].arrive_time = peo[n + ].arrive_time = 1e8;
que[].push_back(peo[n + ]);
que[].push_back(peo[n + ]);
scanf("%d %d", &k, &m);
for(int i = ; i < m; i++){
int t;
scanf("%d", &t);
tab[t].vip = true;
} sort(que[].begin(), que[].end(), cmp);
sort(que[].begin(), que[].end(), cmp);
int i = , j = , num = ;
while(){
int time1 = que[][i].arrive_time, time2 = que[][j].arrive_time;
int tableid = findd(min(time1, time2), );
int viptab = findd(time2, );
if(tab[tableid].finish_time >= * * || min(time1, time2) >= * * )break;
int who;
if(tab[tableid].vip == )who = (time1 < time2)?:;
else who = (max(tab[tableid].finish_time, time1) > time2)?:;
if(who && viptab && tab[viptab].finish_time <= time2)tableid = viptab;
int peoid = (who == )?que[][i].id:que[][j].id;
peo[peoid].serve_time = max(tab[tableid].finish_time, peo[peoid].arrive_time);
peo[peoid].wait = peo[peoid].serve_time - peo[peoid].arrive_time;
tab[tableid].finish_time = peo[peoid].serve_time + peo[peoid].play_time;
cnt[tableid]++;
peo[peoid].can = true;
if(who)j++;
else i++;
//num++;
} sort(peo + , peo + + n, cmp1);
for(int i = ; i <= n; i++){
if(peo[i].wait < )peo[i].wait = ;
if(!peo[i].can)continue;
int h, m, s;
h = peo[i].arrive_time / ( * ) + ;
m = peo[i].arrive_time % ( * );
m = m / ;
s = peo[i].arrive_time % ;
printf("%02d:%02d:%02d ", h, m, s);
h = (peo[i].arrive_time + peo[i].wait) / ( * ) + ;
m = (peo[i].arrive_time + peo[i].wait) % ( * );
m = m / ;
s = (peo[i].arrive_time + peo[i].wait) % ;
printf("%02d:%02d:%02d ", h, m, s);
//cout<<(peo[i].wait + 30) / 60<<endl;
cout<<round(1.0 * peo[i].wait / 60.0)<<endl;
//printf("%d\n", round(1.0 * peo[i].wait / 60.0)); }
printf("%d", cnt[]);
for(int i = ; i <= k; i++){
printf(" %d", cnt[i]);
}
printf("\n");
return ;
}
PAT甲级1026 Table Tennis【模拟好题】的更多相关文章
- PAT甲级1026. Table Tennis
PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...
- PAT 甲级 1026 Table Tennis(模拟)
1026. Table Tennis (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A table ...
- PAT 甲级 1026 Table Tennis (30 分)(坑点很多,逻辑较复杂,做了1天)
1026 Table Tennis (30 分) A table tennis club has N tables available to the public. The tables are ...
- PAT甲级——A1026 Table Tennis
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
- PAT 1026 Table Tennis[比较难]
1026 Table Tennis (30)(30 分) A table tennis club has N tables available to the public. The tables ar ...
- PAT 1026. Table Tennis
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For ...
- PAT 1026 Table Tennis (30)
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
- 1026. Table Tennis (30)
题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...
- 1026 Table Tennis (30分)
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
随机推荐
- grid - 通过网格线名称设置网格项目位置
使用网格线名称设置网格项目位置和使用网格线号码设置网格项目位置类似. 1.引用网格线名称的时候不应该带方括号 <view class="grid"> <view ...
- 用于Spring Boot Jar部署的shell脚本
用于在Jenkins将jar发送到目标节点之后的部署操作, 包含deploy, start, stop, restart功能. 在deploy时会自动备份原jar至指定目录 # Please defi ...
- 生产环境CPU过高问题定位
问题描述: 生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 解决过程: 1.根据top命令,发现 ...
- 【20180409】IT管理之IT十二条令
团队越来越大,靠人管几乎有力无心,只能靠制度管理了. 前段时间对部门颁布了12条令,效果明显. 特此Mark. 汇报: 三条总结:汇报讲究精简,一个事情最多一句话概括. 一页报告:内容精简,报告一页w ...
- iOS性能优化篇 —— 耗电优化总结
手机App耗电的主要来源有以下四个因素: CPU处理,Processing 网络,Networking 定位,Location 图像,Graphics 耗电优化最终目的:通过尽可能降低CPU ...
- 安全工具-cansina
Cansina是一款Web内容的发现工具,使用该工具指定详细的web目录内容作为payload即可破探测出web路径等资源. 工具安装操作如下 pip install --user requests[ ...
- C++ 如何决定字面常量类型
C++ 是如何决定字面常量的类型的? #include <iostream> #include <cmath> int main() { using namespace std ...
- 新内容转入github
所有新内容已经转入 https://github.com/honggzb/Study-General https://github.com/honggzb/Study2016
- linux下用php将doc、ppt转图片
解决方案分成两步: (1)调用unoconv命令将 doc.ppt 转 pdf (2)使用 imagemagick将 pdf 转图片 步骤 1.安装unoconv sudo apt-get insta ...
- 【转】Servlet 生命周期、工作原理
Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Ser ...