#P2655. 一种抢票系统
-
ID: 2170
Tried: 122
Accepted: 30
Difficulty: 5
所属公司 :
华为
时间 :2025年2月19日-留学生
一种抢票系统
题解
题面描述
一个抢票系统有总票数 N(范围 [0,100000]),每个订单请求由用户 UID(8位数字)、订单号(8位数字)和所需票数(范围 [0,100])构成。当用户发起订单请求且付款成功后,其订单进入排队队列;只有当订单请求的票数不超过当前余票数时,该订单才能最终成功。
此外,系统允许在排队期间发起助力请求(即邀请其他用户帮助),助力请求进入同一队列,并可使被助力订单“前进一名”(即在最终处理顺序中上移1位)。
助力请求需满足以下规则:
- 一个用户只能帮助一次(如果重复,后续助力无效)。
- 自己不能给自己助力。
- 助力请求只能对已进入队列的订单起作用(即订单请求必须在助力请求之前到达)。
题目内容
有一个抢票系统,给定总票数 N , N 取值范围为 [0,100000]。每个用户通过唯一的 UID 标识。
当用户发起抢票请求并完成付款时,系统会生成一个订单,订单通过唯一的订单D标识。此时用户的订单请求会进入排队队列。每个订单请求的票数取值范围为 [0,100] 当请求票数不超过当前余票数,则该订单请求成功;否则请求失败。
同一个用户支持发起多次订单请求。
系统提供一种助力排队机制,在上述订单请求排队期间如果邀请其他用户助力,该用户发起的助力系统会生成一个助力请求,助力请求也会进入上述排队队列,助力请求成功,则被助力的订单请求排队可以向前进一名;请求失败则忽略该助力请求。助力请求需要满足如下规则:一个用户只能辅助一次订单请求,重复的辅助无效;自己不能给自己辅助。每次助力请求只能帮助排在前面之前的订单请求。
系统保证所有请求按照请求到达时间顺序排序。为避免同一时间处理太多请求,某个订单的助力请求不能晚于该订单请求30个请求,晚的请求助力视作过期助力,忽略该助力。
订单请求和助力请求总数不超过 10000 。超过最大数目的请求都丢弃。
输入系统总余票数,以及订单请求、助力请求队列,请给出程序输出每个订单请求是否成功。
输入描述
第一行为余票数
后面每一行是一次订单请求的完整描述或者一次助力请求的完整描述。
订单请求的输入格式如下:
UID 请求类型 ( 0 订票) 订单 ID 请求票数
表示标识为 UID 的用户发起订单请求,订单号为订单 ID
助力请求的输入格式如下:
UID 请求类型( 1 助力) 助力订单 ID
表示标识为 UID 的用户帮助订单请求排队前进一名。
UID 为用户的唯一标识,由 8 个 0−9 数字组成;订单 ID 为订单的唯一标识,由 8 个 0−9 数字组成;请求类型取值 0或者 1 ,0 表示订单请求,1 表示助力请求。
输出描述
所有订单请求的订票结果。每一行代表一个订单请求的请求结果。
请求成功,输出:
UID 订单号 请求票数 success
请求失败,输出:
UID 订单号 请求票数 failure
样例1
输入
10
09000001 0 01000001 1
09000002 0 01000002 1
09000003 0 01000003 1
09000004 0 01000004 1
09000005 0 01000005 1
09000006 0 01000006 1
09000007 0 01000007 1
09000008 0 01000008 1
09000009 0 01000009 1
09000010 0 01000010 1
09000011 0 01000011 1
09000012 0 01000012 1
09000013 0 01000011
09000014 0 01000011
09000015 0 01000011
09000016 0 01000011
09000017 0 01000011
输出
09000001 01000001 1 success
09000002 01000002 1 success
09000003 01000003 1 success
09000004 01000004 1 success
09000005 01000005 1 success
09000011 01000011 1 success
09000006 01000006 1 success
09000007 01000007 1 success
09000008 01000008 1 success
09000009 01000009 1 success
09000010 01000010 1 failure
09000012 01000012 1 failure
说明
用户 09000011 本来排位第 11 名,但是被助力了 5 次,排名排至第 6 名,所以订票成功;
用户 09000010 本来排位第 10 名,但是因为后面的请求被助力,所以排位降至第 11 名,所以订票失败。
样例2
输入
5
09000001 0 01000001 1
09000002 0 01000002 1
09000003 0 01000003 1
09000004 0 01000004 1
09000005 0 01000005 3
09000012 1 01000005
09000013 1 01000005
09000014 1 01000005
输出
09000001 01000001 1 success
09000005 01000005 3 success
09000002 01000002 1 success
09000003 01000003 1 failure
09000004 01000004 1 failure
说明
用户 09000005 本来排位第 5 名,但是被助力了 3 次,排名排至第 2 名,所以订票成功;
用户 09000003 、09000004 排位分别降至第 4、5 位,所以订票失败。