思路:贪心
解决这个问题的关键在于如何选择交换哪两个数,我们可以观察到,为了最小化交换操作的次数,我们应该优先将大于k的数移出前k个数,同时将1到k的数移入前k个数。
由于本题只能交换相邻两个数字,因此,我们可以首先找出前k个数中大于k的数的位置,然后找出后n−k个数中1到k的数的位置,然后计算这两个位置的差值的绝对值,这个差值就是需要的最少交换次数。
具体实现我们可以使用两个数组去分别记录[1,k]的下标和[k+1,n]的下标,然后根据上述计算规则去计算
题目内容
小L有一排 n 张卡片,上面分别写着 1 到 n 的整数,每个整数恰好出现一次。
他希望经过若干次操作后,让最前面的 k 张卡片上的数字恰好组成集合 {1,2,…,k}(顺序可以任意)。
每次操作只能交换相邻的两张卡片。
请计算最少需要进行多少次操作。
约束条件
- n 和 k 满足 1≤k≤n≤200000。
- 给出的序列包含了 1 到 n 的每个整数,且每个整数恰好出现一次。
输入描述
第一行包含两个正整数 n 和 k (1≤k≤n≤200000),用空格分隔。
第二行包含 n 个正整数,表示初始序列,这 n 个数包含了 1 到 n 的每个整数,每个整数恰好出现一次,相邻两数之间用空格分隔。
输出描述
输出一个整数,表示最少需要的交换操作次数。
样例1
输入
5 3
4 5 1 2 3
输出
6
说明
初始序列中,前 3 个位置为 4,5,1,其中大于 k 的数 4,5 位于位置 0 和 1(下标从 0 开始);后 2 个位置为 2,3,其中属于 {1,2,3} 的数 2,3 位于位置 3 和 4。
需要把 4,5 移出前 k 个位置,把 2,3 移入前 k 个位置。最优配对:4↔2,距离 3−0=3;5↔3,距离 4−1=3。最少相邻交换次数为 3+3=6。
样例2
输入
4 4
1 3 2 4
输出
0
说明
k=n,目标集合为 {1,2,3,4},即整个序列。当前所有卡片已在目标集合中,无需任何操作,因此答案为 0。
样例3
输入
5 1
3 1 4 2 5
输出
1
说明
只需最前面的 1 张卡片变成 1。初始序列第一个位置为 3,1 位于位置 1。
将 3 和 1 进行一次相邻交换,即可得到 1,3,4,2,5,满足要求。题解中 pos1=[0],pos2=[1],距离为 1−0=1。