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
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
G - Special Permutation | GNU C++17 | Accepted | 31 ms | 3600 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;
}