题意:
现在有一个长度为n的数组,让你按照一个顺序去交换所有一开始的数组的逆序对的位置,从而使得最终的数组非递减。
题解:
那么就是从前往后去做,对于当前位置,找到所有一开始数组中的它与它之后的逆序对的位置,然后按照数值从大到小去交换,这样的话,既能保证最终放在这个位置的值是当前最小的,又能不破坏后面的值的大小情况。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
#define pa pair<int,int>
int a[N];
vector<pa>ans,b;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++)
if(a[j]<a[i])
b.push_back({a[j],j});
if(!b.size())continue;
sort(b.begin(),b.end(),greater<pa>());
for(auto j:b)
ans.push_back({i,j.second});
b.clear();
}
printf("%d\n",ans.size());
for(auto i:ans)
printf("%d %d\n",i.first,i.second);
return 0;
}