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;
}

浙公网安备 33010602011771号