[codeforces 1352G] Special Permutation 构造偶数序列,奇数序列,合并

Codeforces Round #640 (Div. 4)   参与排名人数9749,终于弄明白账号前*的意义,*out of competition,也即虽然该用户参加本场比赛,但不参与排名。

[codeforces 1352G]   Special Permutation   构造偶数序列,奇数序列,合并

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址http://codeforces.com/contest/1352/problem/G

ProblemLangVerdictTimeMemory
G - Special Permutation GNU C++17Accepted31 ms3600 KB

样例构造如下,以下规律是在手动模拟数据过程中发现的。

n是偶数
6
构造不大于6的偶数序列2 4 6,将2移到序列的最右端,序列变成4 6 2
构造不大于6的奇数序列5 3 1
合并两个序列,变成4 6 2 5 3 1

10
构造不大于10的偶数序列2 4 6 8 10,将6移到序列的最右端,序列变成2 4 8 10 6 
构造不大于10的奇数序列9 7 5 3 1
合并两个序列,变成2 4 8 10 6 9 7 5 3 1

n是奇数
7
构造不大于7的偶数序列2 4 6,交换4,6,序列变成2 6 4
构造不大于7的奇数序列7 5 3 1
合并两个序列,变成2 6 4 7 5 3 1

13
构造不大于13的偶数序列2 4 6 8 10 12,交换10,12,序列变成2 4 6 8 12 10
构造不大于13的奇数序列13 11 9 7 5 3 1
合并两个序列,变成2 4 6 8 12 10 13 11 9 7 5 3 1


需特判的情况
n=2,输出-1
n=3,输出-1
n=4,输出2 4 1 3

AC代码如下

#include <cstdio>
#include <algorithm>
using namespace std;
int a[505],b[505],an,bn;
int cmp(int a,int b){
	return a>b;//自大到小排序
}
int main(){
	int t,n,i,c;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		if(n==2||n==3){printf("-1\n");continue;}//特判
		if(n==4){printf("2 4 1 3\n");continue;}//特判
		an=1;
		while(2*an<=n)a[an]=2*an,an++;//构造不大于n的偶数序列
		an--;
		if(n%2==0)c=a[an],a[an]=a[an-2],a[an-2]=a[an-1],a[an-1]=c;//n是奇数
		else c=a[an],a[an]=a[an-1],a[an-1]=c;//n是偶数
		bn=1;
		while(2*bn-1<=n)b[bn]=2*bn-1,bn++;//构造不大于n的奇数序列
		bn--;
		sort(b+1,b+1+bn,cmp);//自大到小排序
		for(i=1;i<=an;i++)printf("%d ",a[i]);
		for(i=1;i<=bn;i++)printf("%d ",b[i]);
		printf("\n");
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值