#640(Div.4)G. Special Permutation(找规律+构造)

题目描述

A permutation of length n is an array p=[p1,p2,…,pn], which contains every integer from 1 to n (inclusive) and, moreover, each number appears exactly once. For example, p=[3,1,4,2,5] is a permutation of length 5.
For a given number n (n≥2), find a permutation p in which absolute difference (that is, the absolute value of difference) of any two neighboring (adjacent) elements is between 2 and 4, inclusive. Formally, find such permutation p that 2≤|pi−pi+1|≤4 for each i (1≤i<n).
Print any such permutation for the given integer n or determine that it does not exist.

Input

The first line contains an integer t (1≤t≤100) — the number of test cases in the input. Then t test cases follow.
Each test case is described by a single line containing an integer n (2≤n≤1000).

Output

Print t lines. Print a permutation that meets the given requirements. If there are several such permutations, then print any of them. If no such permutation exists, print -1.

Example

input
6
10
2
4
6
7
13
output
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,且包含1-n所有数的序列。该序列相邻的两个数的差的绝对值必须在2-4之间。

题目分析

因为奇数列和偶数列中数的差值都是2。所以我们可以将该序列分割成一段奇数数列和一段偶数数列。
先输出1-n中的所有奇数,因为n不确定,所以可以从大到小输出,这样最后一个数必定是1。
然后输出偶数,因为相邻数的差必须在[2,4]之间。因此不能先输出2或最大的偶数。可以先输出4再输出2,再从6开始顺序输出剩余的偶数即可。
通过上面的条件我们可以发现,当n<4时无解,要输出-1。

代码如下
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <unordered_map>
#include <queue>
#include <vector>
#include <set> 
#include <algorithm>
#include <iomanip>
#define LL long long
using namespace std;
int const N=8e3+1;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		if(n<4) {puts("-1"); continue;} 
		for(int i=n;i>=1;i--)
		if(i&1) cout<<i<<' ';       //i&1位运算,i为奇数返回1,偶数返回0
		
		cout<<"4 2 ";
		for(int i=6;i<=n;i+=2)
		cout<<i<<' ';
		puts("");
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/li_wen_zhuo/article/details/106035170