• 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)只是思路,程序没有实现(有些懒了!!)

     

  • 相关阅读:
    Thrift安装编译指南
    Linux磁盘与文件系统管理
    你懂得C,所以C++也不在话下
    加速NFV(网络功能虚拟化)数据面:SR-IOV和DPDK[原文意译]
    十张图看懂SDN与NFV的区别与联系?
    Lambda表达式用法
    论文写作+gnuplot制图
    私钥、公钥、数字签名和数字证书
    synchronized和Lock的异同
    介绍HTTP协议的传输过程
  • 原文地址:https://www.cnblogs.com/ahmasoi/p/2780825.html
Copyright © 2020-2023  润新知