Special Permutation(CF1352G)
题面翻译
给定 t t t 组数据,每组数据包含一个整数 n n n。
对于每个整数 n n n,你需要输出一个长度为 n n n 的全排列 p p p,输出要求对于所有满足 i ∈ [ 1 , n ) i \in [1,n) i∈[1,n) 的 i i i,有 ∣ p i − p i + 1 ∣ ∈ [ 2 , 4 ] |p_i-p_{i+1}| \in [2,4] ∣pi−pi+1∣∈[2,4],如果不存在,输出 − 1 -1 −1,对于每一组数据,输出占一行。
如果有多组解,请输出其中任意一个。
输入格式
第一行包含一个整数 t t t( 1 ≤ t ≤ 100 1\le t\le 100 1≤t≤100)表示输入中的测试用例数。然后是 t t t 测试用例。
每个测试用例由一行描述,其中包含一个整数 n n n( 2 ≤ n ≤ 1000 2\le n\le 1000 2≤n≤1000)。
输出格式
打印 t t t 行符合给定要求的排列。如果有几个这样的排列,那么打印其中的任何一个。如果不存在这样的排列,请打印 − 1 -1 −1。
样例 #1
样例输入 #1
6
10
2
4
6
7
13
样例输出 #1
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 = 20 n=20 n=20,要求差在 2 , 3 , 4 2,3,4 2,3,4 之间,先将偶数和奇数分别排开试试,奇数奇数之间差 2 2 2,偶数偶数之间差 2 2 2。
1 3 5 7 9 11 13 15 17 19 20 18 16 14 12 10 8 6 4 2
发现中间不行,调整一下得:
1 3 5 7 9 11 13 15 17 19 16 20 18 14 12 10 8 6 4 2
找到其中的规律:先输出所有奇数,再输出
n
−
4
n-4
n−4,
n
n
n,
n
−
2
n-2
n−2,最后输出剩下的偶数。
这样就可以解决所有
n
n
n 为偶数的情况了。
奇数部分也可以同理试出,结果为先输出所有奇数,再输出 n − 3 n-3 n−3, n − 1 n-1 n−1,最后输出剩下的偶数。
实现
- 注意输出时要特别判断 n n n 是 4 4 4, 5 5 5, 6 6 6的情况,这些不能被处理到。
- n ≤ 3 n\leq3 n≤3 时全部输出 − 1 -1 −1,没有结果。
代码
#include<bits/stdc++.h>
using namespace std;
int t,n;
int main()
{
cin >> t ;
while(t--)
{
cin >> n ;
if(n<4)
{
cout << -1 << endl ;
continue;
}
if(n==4)
{
printf("2 4 1 3\n");
continue;
}
if(n==6)
{
printf("1 3 5 2 4 6\n");
continue;
}
if(n==5)
{
printf("1 3 5 2 4\n");
continue;
}
if(n%2==0)
{
for(int i=1;i<=n;i+=2)
cout << i << " " ;
cout << n-4 << " " << n << " " << n-2 << " " ;
for(int i=n-6;i>=2;i-=2)
cout << i << " " ;
cout << endl ;
continue;
}
if(n%2==1)
{
for(int i=1;i<=n;i+=2)
cout << i << " " ;
cout << n-3 << " " << n-1 << " " ;
for(int i=n-5;i>=2;i-=2)
cout << i << " " ;
cout << endl ;
continue;
}
}
return 0 ;
}