题目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【模拟好题】的更多相关文章

  1. PAT甲级1026. Table Tennis

    PAT甲级1026. Table Tennis 题意: 乒乓球俱乐部有N张桌子供公众使用.表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表.如果所有的表 ...

  2. PAT 甲级 1026 Table Tennis(模拟)

    1026. Table Tennis (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A table ...

  3. PAT 甲级 1026 Table Tennis (30 分)(坑点很多,逻辑较复杂,做了1天)

    1026 Table Tennis (30 分)   A table tennis club has N tables available to the public. The tables are ...

  4. 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 ...

  5. PAT 1026 Table Tennis[比较难]

    1026 Table Tennis (30)(30 分) A table tennis club has N tables available to the public. The tables ar ...

  6. PAT 1026. Table Tennis

    A table tennis club has N tables available to the public.  The tables are numbered from 1 to N.  For ...

  7. 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 ...

  8. 1026. Table Tennis (30)

    题目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. ...

  9. 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 ...

随机推荐

  1. 转:C# Delegate委托 1

    Delegate中文翻译为“委托”.MSDN中对Delegate的解释如下: C#中的委托类似于C或C++中的函数指针.使用委托使程序员可以将方法引用封装在委托对象内.然后可以将该委托对象传递给可调用 ...

  2. Linux 添加开机启动项的两种方法

      1.编辑文件 /etc/rc.localvim /etc/rc.local #!/bin/sh## This script will be executed *after* all the oth ...

  3. myBase7 激活方法

    一.引言: 之前使用过一段时间的myBase,那时候发现还不太美观,所以弃用了一段时间,最近看到有myBase7出来,使用了一下感觉还可以,但是只能试用一个月,不过还好找到了破解的方法. 二.破解步骤 ...

  4. laya 自定义组件加载错误:显示空白

    laya ide  自定义组件的制作与使用 https://ldc.layabox.com/doc/?nav=zh-js-2-2-3 在xml定义时,resName="sbtn" ...

  5. NodeJs之fs

    NodeJs版本:4.4.4 fs的实用方法 查看文件信息(fs.stat) 定义:fs.stat(path, callback) var fs = require('fs'); fs.stat('t ...

  6. Gradle 离线 安装

    第一步:下载gradle zip 文件 第二步:打开文件夹,例如:C:\Users\Administrator.gradle\wrapper\dists\gradle-3.3-all\55gk2rcm ...

  7. 点云NDT配准方法介绍

    三维配准中经常被提及的配准算法是ICP迭代的方法,这种方法一般般需要提供一个较好的初值,也就是需要粗配准,同时由于算法本身缺陷,最终迭代结果可能会陷入局部最优,导致配准失败,往往达不到我们想要的效果. ...

  8. idea设置条件断点

    只有在指定的条件下才触发断点,在idea中如何设置呢? 方法: 按Ctrl+Shift+F8弹出View Breakpoints 在Condition设置触发条件 结果: 源码 https://git ...

  9. php -- 类对象调用静态方法

    以前一直以为 静态方法的调用:类名::静态方法 非静态方法的调用:类对象->非静态方法 最近研究一个类,发现一个比较奇怪的问题,用“类对象->静态方法”这种方式居然成功的调用了静态方法.很 ...

  10. Python学习笔记——发邮件

    参考:Python3实现163邮箱SMTP发送邮件 1.首先需要注册一个网易的邮箱,开启smtp服务,并使用其授权码 2.发送邮件的Python脚本 #!/usr/bin/python # -*- c ...