题目链接:http://codeforces.com/contest/605/problem/A
大意是对一个排列进行排序,每一次操作可以将一个数字从原来位置抽出放到开头或结尾,问最少需要操作多少次可以将原排列变为有序。
一个比较很想当然的算法是用长度减去最长上升子序列,但这是错误的。
反例:
5
1 3 4 5 2
按照n-lis,会得出答案1,但显然这是做不到的,答案应是2
正解应当是考虑最终变为有序时,所有未经操作的数字,应当是连续的。所以要使得操作次数最少就要求在原来数列中位置递增的最长连续数段。
以上面为例,则3 4 5这3个连续数字组成的数段满足在原来数列中位置递增,且是最长的数段。
代码如下:
1 readInts=lambda: list(map(int, input().split())) 2 n=int(input()) 3 a=readInts() 4 p=[0]*n 5 for i in range(n): 6 p[a[i]-1]=i 7 inc=1;ret=n-1 8 for i in range(1,n): 9 if p[i]>p[i-1]: 10 inc+=1 11 else: 12 inc=1 13 ret=min(ret,n-inc) 14 print(ret)