CF1711A Perfect Permutation 题解

题意
给定一个正整数 \(n\),构造一个排列(一个长度为 \(n\) 的序列,其中由 \(1 \sim n\) 构成,不重复)使其权重最小。

思路
既然要使权重最小,那么就让每一个位置 \(i\) 上的元素为 \(i+1\)\(i−1\),且保证不重复(开个数组记重),可以证明当 \(i\) 大于等于 \(2\) 时,\(i-1 \perp i\)\(i+1 \perp i\)

那么就特判一下当 \(n=1\) 的情况,剩下情况如上构造。

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int t;
int n;
int vis[100005];//判重

int main()
{
    scanf("%d",&t);

    while(t--)
    {
        memset(vis,0,sizeof(vis));//记得初始化!!

        scanf("%d",&n);

        if(n==1)//特判1
        {
            puts("1");
            continue;
        }

        for(register int i=1;i<=n;i++)
        {
            if(!vis[i+1]&&i+1<=n)//未使用且不越界
            {
                printf("%d ",i+1);
                vis[i+1]=1;
                continue;
            }
            if(!vis[i-1]&&i-1>=1)//未使用且不越界
            {
                printf("%d ",i-1);
                vis[i-1]=1;
                continue;
            }
            if(!vis[1])//最后肯定会剩一个为1
            {
                printf("1 ");
                vis[1]=1;
            }
        }

        printf("\n");
    }

    return 0;
} 
posted @ 2022-07-27 21:44  Scorilon  阅读(113)  评论(0)    收藏  举报