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 ...
随机推荐
- Libreoffice 各类文件转换的filtername
LIBREOFFICE_DOC_FAMILIES = [ "TextDocument", "WebDocument", "Spreadsheet&qu ...
- 解决Visual Studio调试突然变慢卡死的问题
最开始摸不到头脑,之前还能好好调试的啊.后来在VS的调试菜单的符号选项里面发现了系统环境变量_NT_SYMBOL_PATH 的值为:srv*c:\symbols*http://msdl.microso ...
- 12C - PDB archive file
在unplug一个pdb的时候,如果将扩展名定义为.pdb,oracle就会创建一个.pdb归档文件.包含pdb数据文件和xml元数据文件的压缩文件.创建archive file之后,就不用分开拷贝数 ...
- Centos 7.x nginx隐藏版本号
一.打开配置文件 #vim /etc/nginx/nginx.conf 二.增加一行: server_tokens off; 三.重启nginx #nginx -s reload 四.效果
- maven project 报错解决方法
1 maven 在添加包后出错,project 处有红线的解决办法 Maven默认会使用本地缓存的库来编译工程,对于上次下载失败的库,maven会在~/.m2/repository/<group ...
- webview调起浏览器
调起浏览器 url = "intent://" + url +"#Intent;scheme=http;action=android.intent.action.VIEW ...
- 你见过的最全面的python重点
首先和大家说个对不起,由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西,对于Nginx的东西我没总结在这里,大家可以Python聚焦看,点击直达专栏哦. ...
- Python基础教程 - Tdcqma
1.1 普通字符串 1.21 错误与异常 1.41 XXXXXX 1.61 XXXXXX 1.81 XXXXXX 1.101 XXXXXX 1.2 转义字符串 1.22 装饰器 1 ...
- Oracle 11gR2 RAC DBCA无法识别ASM磁盘组(ORA-19504,ORA-15045,ORA-17502,ORA-15081)
ORA-19504: failed to create file "+DATA" ORA-15045: ASM file name '+DATA' is not in refere ...
- zookeeper入门及使用(二)- 状态查看
查看服务的角色,看Mode字段,有follower及leader [root@c7bit1 bin]# echo stat | nc 127.0.0.1 2181 Zookeeper version: ...