PAT甲级1026. Table Tennis
PAT甲级1026. Table Tennis
题意:
乒乓球俱乐部有N张桌子供公众使用。表的编号从1到N.对于任何一对玩家,如果有一些表在到达时打开,它们将被分配给具有最小数字的可用表。如果所有的表被占用,他们将不得不等待排队。
假设每对玩家可以玩2个小时以上。
你的工作是计算每个人在排队等候的时间,并为每个表中的一天中提供的玩家数量。
有一件事使得这个程序有点复杂,俱乐部为他们的VIP会员保留了一些表。当VIP桌子打开时,
队列中的第一个VIP对将拥有该权限。然而,如果队列中没有VIP,下一对玩家可以接受。另一方面,如果是VIP对的轮到,但没有VIP表可用,则可以作为任何普通玩家分配。
输入规格:
每个输入文件包含一个测试用例。
对于每种情况,第一行包含整数N(<= 10000) - 玩家对的总数。然后N行跟随,每个包含2次和一个VIP标签:HH:MM:SS - 到达时间,P - 一对玩家的播放时间(分钟),标签 - 如果持有VIP卡,则为1,或如果没有,则为0。
保证在俱乐部开放时到达时间为08:00:00至21:00:00。假设没有两个客户同时到达。按照玩家的信息,有2个正整数:K(<= 100) - 表的数量,M(<K) - VIP表的数量。最后一行包含M表号。
输出规格:
对于每个测试用例,首先按样品显示的格式打印每对玩家的到达时间,服务时间和等待时间。然后在一行中打印每张桌子所服务的玩家人数。请注意,输出必须按服务时间的时间顺序列出。
等待时间必须舍入到整数分钟。如果在关闭时间之前无法获取桌面,则不得打印其信息。
思路:
sick! sick problem! 我一开始比较年轻,把所有的时间用string来算。最后一个就是超时。皮水。转化成秒来算就行了。感觉问题点比较多。模拟排队。这个vip好烦。花了我好多时间。
- vip在普通table和viptable共存会选择viptable不管序号大小
- 超过两个小时按两个小时算
It is guaranteed that the arriving time is between 08:00:00 and 21:00:00 while the club is open.
虽然这么说,但还是有不合法输入?很皮。很smart。
- 超过21:00或者21:00:00都不给服务。
有个vip搞得比较乱。要一点一点分类。分类方法大概就是
//非会员,从从小到大寻找能用的table,找到break,没找到记录最快结束的table
//最快的table不是会员table,计算 ending / number 二级排序
//如果是会员table,向后搜索,结束之前没有会员来,计算,有会员来,swap。计算。
//会员,寻找最小能用的会员table,找到break,没找到记录最快结束的table
//最快结束的table按 ending / isviptable /number 三级排序
贴一点测试数据。
2
10:00:00 30 1
12:00:00 30 1
5 1
3
2
18:00:00 180 1
20:00:00 60 1
1 1
1
1
21:00:00 80 1
1 1
1
1
00:00:00 80 1
1 1
1
3
20:59:59 1 0
21:05:00 80 1
19:00:59 119 0
1 1
1
ac代码:
C++
// pat1026.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<cmath>
#include<unordered_map>
#include<unordered_set>
using namespace std;
struct custom
{
int arriving;
int ending;
int playingtime;
int vip;
int wait;
int turn;
};
struct tab
{
int ending;
int vip;
};
int tablecount[105];
custom cus[10005];
tab q[105];
static bool cuscmp(custom& a, custom& b)
{
return a.arriving < b.arriving;
}
int main()
{
int n, k, m, viptable;
cin >> n;
//custom cus[10005];
int hour, minute, second;
for (int i = 0; i < n; i++)
{
scanf("%d:%d:%d %d %d", &hour, &minute, &second, &cus[i].playingtime, &cus[i].vip);
cus[i].arriving = hour * 60 * 60 + minute * 60 + second;
cus[i] .playingtime *= 60;
if (cus[i].playingtime > 7200) cus[i].playingtime = 7200;
//cus[i] = c;
}
cin >> k >> m;
//vector数组模拟table
//tab q[105];
//初始化table
for (int i = 0; i < k; i++)
{
q[i].ending = 28800;
q[i].vip = 0;
}
//插入vip的table到set中
for (int i = 0; i < m; i++)
{
cin >> viptable;
q[viptable - 1].vip = 1;
}
//vector<int> tablecount(k, 0); //记录table使用次数的计数器
int pos, last_min_table, last_min_ending;
for (pos = 0; pos < n; pos++)
{
//sort(cus.begin() + pos, cus.end(), cuscmp);
sort(cus + pos, cus + n, cuscmp);
if (cus[pos].arriving >= 75600) break;
//非会员,从从小到大寻找能用的table,找到break,没找到记录最快结束的table
//最快的table不是会员table,计算 ending / number 二级排序
//如果是会员table,向后搜索,结束之前没有会员来,计算,有会员来,swap。计算。
//会员,寻找最小能用的会员table,找到break,没找到记录最快结束的table
//最快结束的table按 ending / isviptable /number 三级排序
last_min_ending = 75600;
last_min_table = -1;
bool flag = true;
if (cus[pos].vip == 0) //非会员
{
for (int i = 0; i < k; i++)
{
if (q[i].ending >= 75600) continue;
if (cus[pos].arriving >= q[i].ending)
{
last_min_table = i;
last_min_ending = q[i].ending = cus[pos].arriving;
break;
}
else if (cus[pos].arriving < q[i].ending && q[i].ending < last_min_ending)
{
last_min_ending = q[i].ending;
last_min_table = i;
}
}
if (q[last_min_table].vip == 1) //会员table
{
int j = pos + 1;
while (j < n && cus[j].arriving <= q[last_min_table].ending)
{
if (cus[j].vip == 1)
{
swap(cus[j], cus[pos]);
break;
}
j++;
}
}
}
else //会员
{
for (int i = 0; i < k; i++)
{
if (q[i].ending >= 75600) continue;
if (cus[pos].arriving >= q[i].ending && (q[i].vip == 1 || last_min_ending != cus[pos].arriving))
{
last_min_table = i;
last_min_ending = q[i].ending = cus[pos].arriving;
if (q[i].vip == 1) break;
}
else if (cus[pos].arriving < q[i].ending)
{
if (q[i].ending < last_min_ending || q[i].ending == last_min_ending && q[i].vip == 1)
{
last_min_ending = q[i].ending;
last_min_table = i;
}
}
}
}
if (last_min_ending >= 75600) break;
tablecount[last_min_table]++;
cus[pos].wait = last_min_ending - cus[pos].arriving;
cus[pos].turn = last_min_ending;
q[last_min_table].ending = cus[pos].turn + cus[pos].playingtime;
}
int waittime;
for (int i = 0; i < pos; i++)
{
waittime = cus[i].wait / 60 + (cus[i].wait % 60 < 30 ? 0 : 1);
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n", cus[i].arriving / 3600, (cus[i].arriving % 3600) / 60, cus[i].arriving % 60,
cus[i].turn / 3600, (cus[i].turn % 3600) / 60, cus[i].turn % 60, waittime);
}
for (int i = 0; i < k - 1; i++)
{
cout << tablecount[i] << " ";
}
cout << tablecount[k - 1] << endl;
return 0;
}
PAT甲级1026. Table Tennis的更多相关文章
- 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甲级1026 Table Tennis【模拟好题】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805472333250560 题意: 有k张乒乓球桌,有的是vip桌 ...
- 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)(30 分)
A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For a ...
随机推荐
- Java Spring boot 企业微信点餐系统
欢迎关注我的微信公众号:"Java面试通关手册" 回复关键字" springboot "免费领取(一个有温度的微信公众号,期待与你共同进步~~~坚持原创,分享美 ...
- GO-指针与函数
一.指针类型 1.普通类型,变量存的就是值,也叫值类型.指针类型存的是地址 2.获取变量的地址,用&,比如:var a int, 获取a的地址 &a 3.指针类型,变量存的是一个地址, ...
- git@oschina.net源代码管理使用日记【转】
转自:https://www.cnblogs.com/Juvy/p/3556902.html git的优势: 1 可以创建分支: 2 版本控制是基于每一次提交的,而不需要考虑每次提交了多少个文件. 下 ...
- 新一代的USB 3.0传输规格
通用序列总线(USB) 从1996问世以来,一统个人电脑外部连接界面,且延伸至各式消费性产品,早已成为现代人生活的一部分.2000年发表的USB 2.0 High-speed规格,提供了480Mbps ...
- virsh 命令最新整理。 每个“;”之后是正解
1,migrate --domain --destURL --dname --live(热迁移) migrate lf 192.168.16.3 dname 2,managedsave domain ...
- The hub and spoke model 轮辐模型/辐射模型
最近一些文档中提到The Hub and Spoke Model,这里mark一下.hub表示轮毂,spoke表示轮辐,轮辐模型是简化网络路由的一套中心化的体系,广泛应用于航空.货运.快递以及网络技术 ...
- MySQL 视图、触发器、函数、存储过程
1. 视图 1.1 什么是视图 通俗来讲,视图就是一条 select 语句执行后返回的结果集.所有我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 1.2 视图的特性 视图是对若干张基 ...
- Nginx - 限制并发、限制访问速率、限制流量
1. 前言 本文针对 Nginx 的三个模块进行配置,并证实各自的功能特点: (1)limit_conn_zone 模块 - 限制同一 IP 地址并发连接数: (2)limit_request 模块 ...
- sad 关于一些html5新属性还需要用https才能支持
像我昨天在搞一个录音的小东西 在本地正常录音正常播放 但是放到线上环境http环境上就出现了如上的错误 功能都不能正常使用 然后就改成https线上环境 然后就正常了 如上 大家有什么赐教的欢迎留言 ...
- Android第一篇
1. 网上下载最新版SDK,里面就有一个集成ADT的Eclipse,可以直接用. 2. 最新版SDK会在layout文件夹下有fregment.xml和activity.xml两个布局文件,如果像我这 ...