Codeforces 1375 E. Inversion SwapSort —— 想法,贪心

This way

题意:

现在有一个长度为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;
}

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/107377073