问题描述
- 给你两个数组,a数组里面是
1
−
2
×
n
1 - 2\times n
1−2×n中的奇数任意顺序排列组成,b数组里面是
1
−
2
×
n
1 - 2\times n
1−2×n中的奇数任意顺序排列组成。
- 问你最少需要多少次操作能让a的字典序小于b。
思路分析
- 首先我们要明确两个数组中的元素肯定不同,那么能造成两个数组的字典序大小的就只有两个数组第一个数的大小关系。所以我们只考虑第一个位置即可。
- 那么如何来求最少?我们可以想到的是如果把a,b数组全部都排序,最后得到的b数组中的每一个元素都会大于a数组中该位置及以前位置的元素。
- 另外,对于2,4,6…我们只需要考虑比它小的数在a数组中的位置即可(例如2看1,4看1,3,6看1,3,5)。
- 所以我们就可以用一个变量来储存每一个小于b当前位置的a所在位置下标的最小值,这样我们跑一遍b数组就可以得到答案,答案就是那个最小位置的下标加上当前遍历到的b数组中的元素下标相加减2即可。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int pos[maxn * 2];
int a[maxn];
int b[maxn];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
pos[a[i]] = i;
}
for (int i = 1; i <= n; i++)
{
cin >> b[i];
pos[b[i]] = i;
}
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + n);
int mini = n;
int ans = 2 * n;
for (int i = 1; i <= n; i++)
{
mini = min(mini, pos[a[i]]);
ans = min(ans, pos[b[i]] + mini - 2);
}
cout << ans << endl;
}
return 0;
}