排列的字典序问题

原创 2018年04月15日 18:12:48

排列的字典序问题

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

n个元素{1,2,……, n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下: 

 
给定n以及n个元素{1,2,……, n }的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列。

Input

输入数据的第1行是元素个数n(n≤20)。接下来的1行是n个元素{1,2,……, n }的一个排列。

Output

输出数据的第1行是字典序值,第2行是按字典序排列的下一个排列。

Sample Input

8
2 6 4 5 8 1 7 3

Sample Output

8227
2 6 4 5 8 3 1 7

Hint

思路:

分两步:

一、计算字典值。

 我们可以从从开始算,因为不能有重复,以1开头的后面有7位数有1*7!,然后以2开头的后面有六位数,但第二位要小于6,即有1、3、4、5满足,有4*6!,然后以26...开头的后面有5位数,要求第三位要小于4,即有1,3满足,有2*5!,,,依次类推。。。
       

看例子:

tot=0;

比2小的数有1个,则 tot+=1*7!;

比6小的数有4个,则 tot+=4*6!;

比4小的数有2个,则 tot+=2*5!;

比5小的数有2个,则 tot+=2*4!;

比8小的数有3个,则 tot+=3*3!;

比1小的数有0个,则 tot+=0*2!;

比7小的数有1个,则 tot+=1*1!;

比3小的数没有;

(注:在排列中,求比某个数小的数的个数时,排除之前出现过的数)

 

二、下一个排列。


从数组最后找,找到一个比最后一个数小的数把最后一个数放在之前就可以了

 

可以用   next_permutation(order,order+n);   来求下一个排列,注意开头 加上 

#include<algorithm>
using namespace std;


#include<iostream>
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int jc[21];
    //先算阶乘
    jc[0]=1;
    for(int i=1;i<21;i++)
        jc[i]=jc[i-1]*i;
    
    int n,sum=0,*a,t;
    //n是多少个数,sum是字典序值,a是数组,t是比当前数小的数的个数

    while(cin>>n)
    {
        a=new int[n+1];
        for(int i=0;i<n;i++)//输入数据
            cin>>a[i];
        for(int i=0;i<n-1;i++)
        {
            t=a[i]-1;//比a[i]小的数最多有a[i]-1个
            //循环找前面,如果前面有比当前数小的数,后面比他小的数就少一个
            for(int j=0;j<=i;j++)
            {
                if(a[i]>a[j])
                    t--;
            }
            sum+=t*jc[n-i-1];//计算当前排列数,累加
        }
        cout<<sum<<endl;
        next_permutation(a,a+n);
        for(int i=0;i<n;i++)
            cout<<a[i]<<" ";
        cout<<endl;

    }
    return 0;

}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Matrix97/article/details/79951483

第二章 递归与分治策略(排列的字典序问题)

一. 递归 1.概念 直接或间接地调用自身的算法。用函数自身给出定义的函数称为递归函数。 2.说明 (1)每个递归函数都必须有非递归定义的初始值,否...
  • Nostalgia_
  • Nostalgia_
  • 2017-04-22 17:36:34
  • 335

算法分析与设计之排列的字典序问题

问题描述:n个元素{1,2,3...n}有n!种不同的排列。将这n!个排列按字典序排列,并编号0,1,2,3...n!-1。每个排列的编号为其字典序值。例如,当n=3时,有6个不同排列的字典序如下: ...
  • hello_tomorrow_111
  • hello_tomorrow_111
  • 2017-12-02 16:09:10
  • 679

排列的字典序问题 算法与设计

问题描述: n个元素{1,2,, n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…, n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下: ...
  • zyq_19960204
  • zyq_19960204
  • 2016-10-12 16:10:41
  • 324

练习:排列的字典序问题

排列的字典序问题 问题描述:n个元素{1,}
  • name_z
  • name_z
  • 2014-08-08 18:47:02
  • 864

递归与分治——字典序排列

问题描述: n个元素{1,2,..., n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值...
  • huangxy10
  • huangxy10
  • 2012-07-25 02:29:02
  • 1148

字典序问题(排列组合)

字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1...
  • kavu1
  • kavu1
  • 2016-09-07 08:24:19
  • 2937

计算机算法设计与分析-字典序问题

  • 2008年11月24日 22:38
  • 701B
  • 下载

排列的字典序问题「Permrank」题解

  • 2017年07月24日 09:15
  • 15KB
  • 下载

排列的算法(一)——字典序算法

从n个不同元素中取出n个元素的排列,称为n个不同元素的全排列。 全排列的生成算法就是对于给定的元素集合,用有效的方法将所有可能的全排列无重复无遗漏地列举出来。...
  • BabyNumber
  • BabyNumber
  • 2015-01-14 10:49:53
  • 3272
收藏助手
不良信息举报
您举报文章:排列的字典序问题
举报原因:
原因补充:

(最多只允许输入30个字)