Example
input
3
2
3 1
4 2
3
5 3 1
2 4 6
5
7 5 9 1 3
2 4 6 10 8
output
0
2
3
题意:
每次交换相邻的两个数,问两个数列共同交换多少次,可以使得第一个数列的首个数字小于第二个数列的首个数字,求最少的交换次数。
解析:
由题意得第一数列为1,3,5,7...n-1,第二个数列为2,4,6,8...n,所以我们记录每个数和其下标,然后排序。
因为对于某个a[ i ],b[ i ]及其后面的数都比它大,所以我们从后往前遍历,每次计算数组b当前 i 后面的最小值,然后维护答案即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int t,n,x,y;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
pair<int,int>a[n+1],b[n+1];
for(int i=1;i<=n;i++){
scanf("%d",&x);
a[i]={x,i};
}
for(int i=1;i<=n;i++){
scanf("%d",&x);
b[i]={x,i};
}
sort(a+1,a+n+1);
sort(b+1,b+n+1);
int f=n+1,res=2*n+1;
for(int i=n;i>0;i--){
f=min(f,b[i].second);
res=min(res,f-1+a[i].second-1);
}
printf("%d\n",res);
}
return 0;
}