1 条题解
-
0
方法思路
逆序数分析:
逆序数是衡量序列中元素相对顺序的指标。最大逆序数为 ,此时序列为完全降序排列。
最小逆序数为 ,此时序列为完全升序排列。
构造最小排列:
为了构造满足条件的最小排列,我们需要在保证逆序数恰好为 的前提下,使排列尽可能小。
具体步骤:
确定一个分割点 ,使得前 个数的逆序数不超过 。
前 个数按升序排列,这部分不贡献逆序数。
第 个数选择适当的数值,使得剩余逆序数恰好由后 个数的降序排列贡献。
关键计算:
计算分割点 ,使得 。
确定第 个数的位置,以调整逆序数到精确值 。
C++代码实现:
#include <stdio.h> int n,m; int main(){ int i,j,sp; while(scanf("%d%d",&n,&m)==2) { if(n==-1&&m==-1) break; sp=1; while(sp*(sp-1)/2<m) sp++; int k=n-sp; for(i=1; i<=k; i++) printf("%d ",i); int first=m-(sp-1)*(sp-2)/2; printf("%d ",first+1+k); for(i=sp; i>1; i--) { if(i==first+1) continue; printf("%d ",i+k); } printf("%d\n",i+k); } return 0; }
- 1
信息
- ID
- 1086
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者