Cow Line

【原题链接】

【题意说明】

1~N这N个数字,共有N!种排列顺序!并按字典序对其编号。问题:

(1)若给定的是一个排列顺序,求其编号;

(2)若给定编号,求其排列!

【问题分析】

此题我处理的很不好!关键是问题(1)处理的不好!

对于问题(2),

(1)先预处理a[i]=i!,并令k=1;

(2)从a[n]开始找到第1个比编号x小的位置j,从第k位到n-j-1位置的值依次从小到大选择未使用的数字;

(3)对于第n-j这个位置,看x/a[j]的值,再剩下未用的数中选择第x/a[j]大的数;

(4)令k=n-j+1; x%=a[j];按步骤(2)~(4)再处理x;

(5)当x==0时结束。

这样就找到满足问题(1)所要求的结果了!

对于问题(1),我采用的笨办法是,把问题(1)转换成问题(2),怎么转换的呢!!就是从1~n!,按二分法求出中间数mid,对于这个中间数按问题(2)的方法求出结果,与问题(1)的数据比较,直到找到结果!这里费时太多了!

其实可以借鉴问题(2)的思路,反过来求就可以了:

(1)令k=1;s=1;(k为位置,s为编号)

(2)从k位开始,比较其位置是否对应每个未使用的第k小数,直到不相同;

(3)计算第k位置的数是剩下数中第x大的数,s+=x*a[n-k];

(4)继续对后面的位置按步骤(2)~步骤(4)比较,直到所有的位置都比较完成!

以上对于问题(1)只是思路,程序没有实现(有些懒了!!)

 

posted on 2012-11-21 15:36  生活不变心在变  阅读(163)  评论(0编辑  收藏  举报

导航