首页 > 试题广场 >

排序次数

[编程题]排序次数
  • 热度指数:2331 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
\hspace{15pt}给定一个长度为 n 的整数数组 \{a_1,a_2,\dots,a_n\}。小摩希望将数组调整为单调不减的顺序,即满足 a_1 \leqq a_2 \leqq\dots \leqq a_n
\hspace{15pt}他只能重复进行以下操作:
{\hspace{20pt}}_\texttt{1.}\,任选一个下标 i\,\left(1\leqq i\leqq n\right)
{\hspace{20pt}}_\texttt{2.}\,将元素 a_i 从当前位置删除,并插入到数组的末尾(其余元素的相对顺序保持不变)。
\hspace{15pt}请你求出使数组变为严格递增所需的最少操作次数。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 5\times 10^3\right) 表示数组的长度。 
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(-10^3\leqq a_i\leqq 10^3\right) 表示数组元素。


输出描述:
\hspace{15pt}在一行上输出一个整数,代表最少操作次数。
示例1

输入

4
19 7 8 25

输出

2

说明

\hspace{15pt}对于第一组样例: 
\hspace{23pt}\bullet\,第一次操作,将 19 移动到末尾,数组变为 \{7,8,25,19\}
\hspace{23pt}\bullet\,第二次操作,将 25 移动到末尾,数组变为 \{7,8,19,25\},此时数组严格递增。
\hspace{15pt}因此答案为 2
n = int(input())
lst = [int(x) for x in input().split()]

while len(lst) > 0 and lst[0] == min(lst):
    lst = lst[1:]

if len(lst) == 0:
    print(0)
else:
    min_idx = len(lst) - lst[::-1].index(min(lst)) - 1
    second_min = min(lst[:min_idx])
    result = min_idx + sum([x > second_min for x in lst[min_idx + 1:]])
    print(result)
发表于 2024-08-17 18:49:57 回复(0)