Special Permutation(CF1352G)题解

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] pipi+1[2,4],如果不存在,输出 − 1 -1 1,对于每一组数据,输出占一行。

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

输入格式

第一行包含一个整数 t t t 1 ≤ t ≤ 100 1\le t\le 100 1t100)表示输入中的测试用例数。然后是 t t t 测试用例。

每个测试用例由一行描述,其中包含一个整数 n n n 2 ≤ n ≤ 1000 2\le n\le 1000 2n1000)。

输出格式

打印 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 n4 n n n n − 2 n-2 n2,最后输出剩下的偶数
这样就可以解决所有 n n n偶数的情况了。

奇数部分也可以同理试出,结果为先输出所有奇数,再输出 n − 3 n-3 n3 n − 1 n-1 n1,最后输出剩下的偶数

实现

  • 注意输出时要特别判断 n n n 4 4 4 5 5 5 6 6 6的情况,这些不能被处理到。
  • n ≤ 3 n\leq3 n3 时全部输出 − 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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值