关于字典序列问题的一个脑洞->>

前阵子窝在宿舍打第一次比赛的时候就遇到关于字典序列的问题,昨天不禁脑洞大开,觉的关于字典排序还有很多东西是值得思考的。。。。。。

比如现在给你一N长度的字典序列 让它完全排布开来 如

{ (123) , ( 132) , ( 213 ) , (231) , ( 312 ) , (321) }

当我给你231这一子列的时候 如何确定它在上述集合中的位置呢??

也就是如何知道231在上述集合中是排在第4的位置上的

假设有N位字典序列,第i位的数字记为num[i];

那么这个num[i]在num[i]到num[N]中由小到大排列后的序列号

记为rank[i]

例如 一串数字   53214 中

rank[1]=5   因为53214排序后为12345

rank[2]=3   因为3214排序后为1234

rank[3]=2   因为214排序后为124

rank[4]=1   因为14排序后为14

rank[5]=1   因为4排序后为4

那么 当给你一串长度为N的字典排列的时候,如何求出它在这个排列表里的排名呢?经过总结后得出以下的计算公式


自行取例进行验证

对于通过程序求出字典子列的序列号,具体的算法过程描述如下

给定你一串长度为N的字典子列,P1 P2 P3 P4...........PN;

 

1.构造一个长度也为N的一维数组num[N+1]并将上述字典子列存贮在这个二维数组中

如num[1]=P1,num[2]=P2,num[3]=P3........num[N]=PN,

2.逐个逐个求出rank[i],即求出P1在P1到PN的位置,P2在P2到PN的位置。。。。。。。。。

3.在进行逐个逐个求和;

具体代码的实现如下,

#include<iostream>

using namespace std;

const int MAX=10;

int a[MAX+1];

int b[MAX+1];

int RANK[MAX+1];

int factorial(int n);

 

int main( )

{

    int n,m,i,j;

  while(cin>>n)

     {

         long long sum=1;

         m=n;

    for( i=1;i<=n;i++)

        cin>>a[i];

    for( i=1;i<=n;i++)

        b[i]=i;

    for( i=1;i<=n;i++)

        for( j= 1;j<=m;j++)

           if(a[i]==b[j])

    {

        RANK[i]=j;

        if(j != m)

while( j != m )  {a[i]=a[i+1];i++;}           

--m;

        break;

    }

    for( i=1;i<=n-1;i++)

        sum+=(RANK[i]-1)*factorial(n-i);

        cout<<sum<<endl;

     }

    return 0;

}

int factorial(int n)

{

    return n==0?1:factorial(n-1)*n;

}

 

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值