最小调整顺序次数、特异性双端队列 逻辑分析
题目描述
有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据.小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据
现在要求移除数据的顺序为1到n.
为了满足最后输出的要求,小A可以在任何时候调整队列中数据的顺序.
请问小A最少需要调整几次才能够满足移除数据的顺序正好是1到n;
输入描述
第一行一个数据n,表示数据的范围。
接下来的2n行,其中有n行为添加数据,指令为:
"head addx”表示从头部添加数据X
"tail addx”表示从尾部添加数据X,
另外n行为移出数据指令,指令为:“remove”的形式,表示移出1个数据1≤n≤3*10^5
所有的数据均合法
输出描述
一个整数,表示 小 A 要调整的最小次数
`def min_adjustment(instructions):
queue = []
adjustments = 0
target = 1
for instruction in instructions:
if instruction.startswith("head"):
_, data = instruction.split()
queue.insert(0, int(data))
elif instruction.startswith("tail"):
_, data = instruction.split()
queue.append(int(data))
elif instruction == "remove":
print(queue)
if queue[0] != target:
adjustments += 1 # 不是按照顺序输出的,需要排序下,只是说操作,就排序就可以
queue.sort()
target += 1 # 记录当前list坐标 12345
queue.pop(0) # 出队
return adjustments
输入是12345 这样输入, 输出也要是12345,如果输出不是顺序的,就需要sort排序下
n = int(input()) # 读取输入
instructions = [input() for _ in range(2 * n)]
result = min_adjustment(instructions)
print(result)
`