CF1374F Cyclic Shifts Sorting(选择排序)

题意:

一次操作,可以使得一个三元组往右旋转一格,请你在N*N次操作以内使得一个序列变得有序。

题解:

模拟一个选择排序的过程,每次把之后最小的元素换到当前位置,正反做两遍。

#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int a[maxn]; 
int t;
int n;
int tot=0;
vector<int> ans;
void R (int u) {
    //旋转以u为起点的三元组
    ans.push_back(u);
    tot++;
    int t1=a[u];
    int t2=a[u+1];
    int t3=a[u+2];
    a[u]=t3;
    a[u+1]=t1;
    a[u+2]=t2;
}
int main () {
    scanf("%d",&t);
    while (t--) {
        ans.clear();
        tot=0;
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        for (int i=1;i<=n-2;i++) {
            int u;
            int Min=1e9;
            for (int j=i;j<=n;j++) {
                if (a[j]<Min) Min=a[j],u=j;  
            }
            while (u>=i+2) R(u-2),u-=2;
            if (u==i+1) {
                R(i);
                R(i);
                continue;
            }
        }
        for (int i=n;i>=3;i--) {
            int u;
            int Max=-1;
            for (int j=i;j>=1;j--) {
                if (a[j]>Max) Max=a[j],u=j;  
            }
            while (u<=i-2) R(u),R(u),u+=2;
            if (u==i-1) {
                R(i-2);
                continue;
            }
        }
        for (int i=1;i<n;i++) if (a[i]>a[i+1]) tot=-1;
        printf("%d\n",tot);
        if (tot!=-1) {
            for (int i=0;i<ans.size();i++) printf("%d ",ans[i]);
            printf("\n");
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/zhanglichen/p/13209212.html