试题 历届真题 双向排序(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操作没有意义)

posted @ 2022-03-11 21:00  律四  阅读(352)  评论(0编辑  收藏  举报