【PAT】A1026 Table Tennis【快乐模拟】

模拟乒乓球俱乐部的桌子分配,考虑VIP优先权。输入包含玩家到达时间、游玩时间和VIP状态,输出玩家等待时间及每张桌子的服务人数。算法关键在于处理VIP玩家优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For any pair of players, if there are some tables open when they arrive, they will be assigned to the available table with the smallest number. If all the tables are occupied, they will have to wait in a queue. It is assumed that every pair of players can play for at most 2 hours.

Your job is to count for everyone in queue their waiting time, and for each table the number of players it has served for the day.

One thing that makes this procedure a bit complicated is that the club reserves some tables for their VIP members. When a VIP table is open, the first VIP pair in the queue will have the priviledge to take it. However, if there is no VIP in the queue, the next pair of players can take it. On the other hand, if when it is the turn of a VIP pair, yet no VIP table is available, they can be assigned as any ordinary players.

Input Specification:

Each input file contains one test case. For each case, the first line contains an integer N (≤10000) - the total number of pairs of players. Then N lines follow, each contains 2 times and a VIP tag: HH:MM:SS - the arriving time, P - the playing time in minutes of a pair of players, and tag - which is 1 if they hold a VIP card, or 0 if not. It is guaranteed that the arriving time is between 08:00:00 and 21:00:00 while the club is open. It is assumed that no two customers arrives at the same time. Following the players’ info, there are 2 positive integers: K (≤100) - the number of tables, and M (< K) - the number of VIP tables. The last line contains M table numbers.

Output Specification:

For each test case, first print the arriving time, serving time and the waiting time for each pair of players in the format shown by the sample. Then print in a line the number of players served by each table. Notice that the output must be listed in chronological order of the serving time. The waiting time must be rounded up to an integer minute(s). If one cannot get a table before the closing time, their information must NOT be printed.

Sample Input:

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

Sample Output:

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

思路

我原来用的优先队列,然后时间的递进考虑下一个空闲桌或者下一个进等待队列的人,但是可能逻辑不严密有两个点没有过,然后写了下面这版。
这里的难点就是要注意当且仅当等待队列里有vip,且有vip桌空出的时候才会对vip优先服务。为了方便,我们用一个vipInQ来计数在队列中的vip玩家数,在空出一个空闲桌的时候,如果该空闲桌是vip桌且队列中有vip玩家,我们才进行优先服务。
这类题一般不会卡时间,只要用最简单的办法严密地模拟即可。

代码

#include <cstdio>
#include <algorithm>
#define MAX_N 10000
#define MAX_K 101
#include <queue>
#include <cmath>
using namespace std;
struct Player{
   
   
    int arrive;
    int server;
    int duration;
    bool isVIP;
    void init(int arrive, int duration, bool isVIP){
   
   
        this->arrive = arrive;
        this->duration = duration;
        this->isVIP = isVIP;
    };
    
}players[MAX_N];
bool cmp(Player p1, Player p2){
   
   
    return p1.arrive < p2.arrive;
};
struct Table{
   
   
    Player* player;
    bool isVIP;
    int open
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值