-
题目背景 hwjj 作为《大学计算机基础》的助教组长,每天在微信上向他请教问题的大一同
学非常多,请你帮他记录一下他回消息的名单。 -
题目描述:
最开始时,hwjj 的微信是没有未读消息的。之后在每一个时刻,hwjj 的手机只 能处于以下三个状态的一种:接收消息,回复消息,或者什么都不做。这是由于 hwjj的手机太卡了,若某一时刻手机需要接收消息,则他就无法执行回复消息的操作;只要该时刻可以执行回复消息的操作且当前仍有未回复的消息,hwjj总会尝试挑选最新的消息来回复,在这一时刻回复完毕并把这个聊天框删除,当然这一时刻 hwjj 只能回复一个人的消息。按顺序给出 hwjj 将要接收到的来信人以及相应时刻,请你按照
hwjj 回复他们的时间输出一份名单。 -
输入格式:
一共n+1行。第一行为一个正整数 n,表明会有 n 个人给 hwjj 发消息。
接下来的 n 行,每行用空格隔开的一个整数 b 和一个字符串 s,表示在 b 时刻名字为 s 的人给 hwjj 发了消息 (b<10000)。 -
输出格式:
输出共 n 行,每行为用空格隔开的一个整数 c 和一个字符串 s1,表示在 c 时 刻名字为 s1 的人收到了 hwjj 的回复。 -
输入样例 1: 5
1 lice
2 ob
3 om
5 rown
8 ack -
输出样例 1:
4 om
6 rown
7 ob
9 ack
10 lice -
输入样例 2:
3
1 hwgg
4 hwdd
5 hwmm -
输出样例 2:
2 hwgg
6 hwmm
7 hwdd -
说明/提示
保证每个人名最多只会出现一次,且每个时刻最多只有一个人给 hwjj 发消息。
保证输入的名单是按照时间从小到大的顺序。且每个人的名字均只由大小写字母
组成,名字长度不超过 10。 -
实验指导:
- 本题在处理消息时,会优先处理最新收到的消息,这实质上是一个“栈”结构,
接收消息时入栈,回复消息时出栈。- 判断列表是否为空可以利用len函数。
class Stack(object):
def __init__(self):
# 创建空列表实现栈
self.__list = []
def is_empty(self):
# 判断是否为空
return self.__list == []
def push(self, item):
# 压栈,添加元素
self.__list.append(item)
def pop(self):
# 弹栈,弹出最后压入栈的元素
if self.is_empty():
return
else:
return self.__list.pop()
def top(self):
# 取最后压入栈的元素
if self.is_empty():
return
else:
return self.__list[-1]
data = []
stack = Stack()
lens = input()
for i in range(int(lens)):
item = input()
data.append(item.split(" "))
while len(data) > 0:
item = data.pop(0)
if stack.is_empty():
stack.push(item)
elif int(item[0]) - int(stack.top()[0]) == 1:
stack.push(item)
else:
i = int(item[0]) - int(stack.top()[0]) - 1
start = int(stack.top()[0])
for m in range(i):
if not stack.is_empty():
top = stack.pop()
time = int(top[0])
user = top[1]
print(start + 1 + m, user)
stack.push(item)
# print("---------------------------------")
# print(stack)
i = 1
start = 0
if not stack.is_empty():
start = int(stack.top()[0])
while not stack.is_empty():
top = stack.pop()
time = int(top[0])
user = top[1]
print(start + i, user)
i += 1