zoukankan      html  css  js  c++  java
  • 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
    ",tot);
            if (tot!=-1) {
                for (int i=0;i<ans.size();i++) printf("%d ",ans[i]);
                printf("
    ");
            }
        }
    }
  • 相关阅读:
    [BJOI2015]树的同构 && 树哈希教程
    「HNOI2014」世界树
    CF613D Kingdom and its Cities
    「HEOI2014」大工程
    虚树教程
    [SDOI2011]消耗战
    CF1216E Numerical Sequence
    vim8.1安装
    luoguP5024 保卫王国
    动态DP教程
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13209212.html
Copyright © 2011-2022 走看看