题目链接
参考代码
- 题目思路:这个题目明显就是要排序的,第一个序列最小值和第二个序列最大值相对应,以此类推。(但是只知道应该是这样,但代码实现……还得看大佬代码)只能说自己还是太菜了,读大佬的代码还读了一会,然后做了下注释,做下笔记。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
struct pot
{
int id;
int val;
bool operator < (const pot &obj) const
{
return val < obj.val;
}
}p[maxn], p1[maxn];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++) scanf("%d", &p[i].val), p[i].id = i;
for(int i = 1; i <= n; i++) scanf("%d", &p1[i].val), p1[i].id = i;
sort(p+1, p+1+n);
sort(p1+1, p1+1+n);
for(int i = 1; i <= n; i++)
a[p1[n-i+1].id] = p[i].id;
int ans = 0;
for(int i=1;i<=n;i++)
if(a[i] == i) ans++;
for(int i = 1; i <= n; i++)
{
if(a[i] == i) continue ;
ans++;
int xx = a[i];
while(a[xx] != xx)
swap(a[xx], xx);
}
cout << n-ans << endl;
return 0;
}