linkkk
题意:
将1 − 2 n 的奇数任意顺序放到a数组,偶数任意顺序放到b数组。每次可以交换某数组的相邻两项,问a < b
思路:
元素互不相同,比较第一个就行。
每次可以只移动a中元素或b中元素或两者都移动,考虑怎么计算最优。
枚举a , b的首元素是哪个就可以了。
用m a p表示将a i
移动到首位需要的次数。
从2 n倒着遍历,遇到奇数的话更新答案,遇到偶数的话更新将元素移动到首位的最小次数,由于是倒着枚举,所以对于奇数来说,后面的偶数比他大,次数还小,所以一定满足a < b
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10,inf=0x3f3f3f3f; int a[maxn],b[maxn]; map<int,int>mp; int main(){ int _;cin>>_; while(_--){ int n;cin>>n; for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]=i-1; for(int i=1;i<=n;i++) cin>>b[i],mp[b[i]]=i-1; int ans=inf,res=inf; for(int i=2*n;i;i--) if(i&1) ans=min(ans,mp[i]+res); else res=min(res,mp[i]); cout<<ans<<endl; } return 0; } /* 3 3 5 1 2 4 6 */