zoukankan      html  css  js  c++  java
  • #luogu整理 CF1352G Special Permutation

    (zay)讲的题

    luogu P6599 异或

    luogu CF1352G Special Permutation

    luogu CF1360F Spy-string

    luogu CF1352G Special Permutation

    题目描述

    给定 (t) 组数据,每组数据包含一个整数 (n)

    对于每个整数 (n),你需要输出一个长度为 (n) 的全排列 (p),输出要求对于所有满足 (i in [1,n))(i),有 (|p_i - p_{i+1}| in [2,4]),如果不存在,输出 (-1),对于每一组数据,输出占一行。

    如果有多组解,请输出其中任意一个。

    样例

    (in)

    6
    10
    2
    4
    6
    7
    13
    

    (out)

    9 6 10 8 4 7 3 1 5 2 
    -1
    3 1 4 2 
    5 3 6 2 4 1 
    5 1 3 6 2 4 7 
    13 9 7 11 8 4 1 3 5 2 6 10 12
    

    思路:

    先随便分析一下:对于n = 8,我们可以这样构造:

    [1 3 5 7 4 8 6 2 ]

    对于n = 7,我们可以这样构造:

    [1 3 5 7 4 6 2 ]

    那如果有数字(x = 8(or 7) + 2k (k in Z^*)),我们能够通过在两边加1、2,然后把整个数组的所有数字都加2构造出来。

    对于小于等于6的n,我们可以直接next_permutation

    (Code)

    int t,n;
    int a[2000];
    int main(){
        // cout << "I AK IOI" << endl;
        // cout << "IOI AK I" << endl;
        // cout << "CYCYCYC" << endl;
        // cout << "YCYCYCY" << endl;
        cin >> t;
        while(t--){
            cin >> n;
            for(int i = 1;i <= n; i++) a[i] = i;
            if(n == 1){
                cout << -1 << endl;
                continue;
            }
            if(n <= 6){
                bool F = 0;
                do{
                    bool flag = 0;
                    for(int i = 2;i <= n; i++){
                        if(abs(a[i] - a[i-1]) > 4 || abs(a[i] - a[i-1]) < 2) flag = 1;
                    }
                    if(flag == 0) break;
                    if(!next_permutation(a+1,a+1+n)){F = 1;break;}
                }while(1);
                if(!F){
                    for(int i = 1;i <= n; i++) cout << a[i] << ' ';
                    cout << endl;
                }else cout << -1 << endl;
                continue;
            }else if(!(n & 1)){
                for(int i = 1;i <= n/2; i++) cout << 2 * i-1 << ' ';
                cout << n-4 << ' ';
                cout << n << ' ';
                cout << n-2 << ' ';
                for(int i = n/2 - 3;i >= 1; i--) cout << i * 2 << ' ';
                cout << endl;
            }else{
                for(int i = 1;i <= n/2+1; i++) cout << 2 * i-1 << ' ';
                cout << n-3 << ' ';
                cout << n-1 << ' ';
                for(int i = n/2 - 2;i >= 1; i--) cout << i * 2 << ' ';
                cout << endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    ubuntu 设置静态ip
    Mysqldump参数大全
    MySQL主从数据库同步
    MySQL的information_schema的介绍
    mysql的REGEXP 和like的详细研究和解释
    查询语句小技巧
    linux 安装软件,卸载软件 等的几种方式
    正则表达式的神秘面纱
    29
    【转载】关于c++中的explicit
  • 原文地址:https://www.cnblogs.com/Cao-Yucong/p/13125357.html
Copyright © 2011-2022 走看看