试题 历届真题 双向排序(python)
问题描述
方案一(60分)
问题分析
输入n、m,n表示序列长度,m表示操作的次数
接下来m行,每行第一个数p表示要进行的操作,第二个数q表示进行操作的数。
需要注意的是,当p=0时,对前1:q进行降序;p=1时,对q:n进行升序排序。
总体上就是截取一段数进行排序。
提交代码
n,m = input().split()
n = int(n)
m = int(m)
# 初始化数组
a = [i+1 for i in range(n)]
# 进行m次操作
for i in range(m):
p,q= input().split()
p = int(p)
q = int(q)
if p==0:
tmp = a[0:q]
tmp.sort(reverse=True)
a[0:q] = tmp
else:
tmp =a[q-1:n]
tmp.sort()
a[q-1:n] = tmp
# print(a)
for i in a:
print(i,end=" ")
提交结果
只有60分,四个点超时
结果分析
可能有十万次操作,每一次操作加起来会超过时间限制,为此我们需要进行优化,减少进行排序的次数。
方案二
减少操作次数
两个相邻的0操作
0操作就是对前n位数进行降序操作,当有两个相邻的0操作时,实际上只进行了一次0操作,即n更大的数。
因为两个都是对前几位数进行降序操作,所以实际上只有n更大的操作有效(因为n更大的区间会覆盖小的操作区间)。
两个相邻的1操作
同理,对两个相临的1操作,也是大区间覆盖小区间,合并为一次操作;1操作是对n位之后的数进行升序操作,所以n更小的操作区间更大。
间隔的相同操作(重点)
在经过以上的几个操作后,是0和1操作相间,同时第一个操作一定是0操作(刚开始的时候数组是递增的,所以第一个操作是1操作没有意义)