1 条题解
-
0
解题思路
题目要求我们找到一个长度为 的排列 ,使得序列 恰好是 到 的一个排列。这种排列被称为完美排列。
关键观察
- 存在条件:经过分析可以发现,完美排列存在的充分必要条件是 满足 或 。换句话说,当 除以 4 余 0 或 1 时,存在完美排列;否则不存在(输出 0)。
- 构造方法:
- 当 时:
- 排列的构造方式是分段构造,具体如下:
- 第一个数是 。
- 接着是 到 的递减序列。
- 然后是 到 的递减序列。
- 接着是 到 的递减序列。
- 然后是 。
- 最后是 到 的递减序列。
- 排列的构造方式是分段构造,具体如下:
- 当 时:
- 排列的构造方式类似于 ,但需要额外处理最后一个数:
- 第一个数是 。
- 接着是 到 的递减序列。
- 然后是 到 的递减序列。
- 接着是 到 的递减序列。
- 如果 ,输出 。
- 然后是 到 的递减序列。
- 如果 ,最后输出 。
- 排列的构造方式类似于 ,但需要额外处理最后一个数:
- 当 时:
- 其他情况:如果 不满足 或 ,则直接输出 0。
#include<cstdlib> #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; int main() { int N,k; while(scanf("%d",&N)==1) { if(N%4==0) { k=N/4; printf("%d ",2*k+1); for(int i=4*k;i>=3*k+2;i--)printf("%d ",i); for(int i=3*k;i>=2*k+2;i--)printf("%d ",i); for(int i=2*k;i>=k+1;i--)printf("%d ",i); printf("%d ",3*k+1); for(int i=k;i>=1;i--)printf("%d ",i); } else if(N%4==1) { k=(N-1)/4; printf("%d ",4*k+1); for(int i=4*k;i>=3*k+2;i--)printf("%d ",i); for(int i=3*k;i>=2*k+2;i--)printf("%d ",i); for(int i=2*k;i>=k+1;i--)printf("%d ",i); if(k)printf("%d ",3*k+1); for(int i=k;i>=1;i--)printf("%d ",i); if(k)printf("%d ",2*k+1); } else { printf("0"); } putchar('\n'); } return 0; }
- 1
信息
- ID
- 1826
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者