zoukankan      html  css  js  c++  java
  • 【2-6】排列的字典序问题

    问题描述:
    n 个元素{1,2,, n }有 n!个不同的排列。将这 n!个排列按字典序排列,并编号为 0,1,…,
    n!-1。每个排列的编号为其字典序值。例如,当 n=3 时,6 个不同排列的字典序值如下:
    字典序值 0 1 2 3 4 5
    排列 123 132 213 231 312 321
    ´编程任务:
    给定 n 以及 n 个元素{1,2,, n }的一个排列,计算出这个排列的字典序值,以及按字
    典序排列的下一个排列。
    ´数据输入:
    由文件 input.txt 提供输入数据。文件的第 1 行是元素个数 n。接下来的 1 行是 n 个元素
    {1,2,, n }的一个排列。
    ´结果输出:
    程序运行结束时,将计算出的排列的字典序值和按字典序排列的下一个排列输出到文件
    output.txt 中。文件的第一行是字典序值,第 2 行是按字典序排列的下一个排列。
    输入文件示例 输出文件示例
    input.txt output.txt
    8
    2 6 4 5 8 1 7 3
    8227
    2 6 4 5 8 3 1 7

    【题解】

    康拓展开和逆康拓展开。 (或者用下一个排列的求法也行);

    【代码】

    #include <cstdio>
    #include <cstring>
    #define ll long long
    using namespace std;
    
    const int N = 15;
    
    int n;
    int a[N+10],b[N+10];
    ll f[N+10];
    
    ll kangtuo(int a[N+10]){
        ll s = 0;
        for (int i = 1;i <= n;i++){
            int v = 0;
            for (int j = i+1;j<= n;j++){
                if (a[j]<a[i]){
                    v++;
                }
            }
            s+=1LL*v*f[n-i];
        }
        return s+1;
    }
    
    int main(){
        f[0] = 1;
        for (int i = 1;i <= N;i++) f[i] = f[i-1]*i;
        scanf("%d",&n);
        for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
        ll ans1 = 0;
        ans1 = kangtuo(a);
        printf("%I64d
    ",ans1);
        //让你求出字典序为ans1+1的序列(对应了有ans1个序列比它小)所以不用递增ans1
    
        int tag[N+10];
        memset(tag,0,sizeof(tag));
        for (int i = 1;i <= n;i++){
            b[i] = ans1/f[n-i];
            for (int j = 1;j <= n;j++){
                if (tag[j]==0){
                    b[i]--;
                    if (b[i]<0){
                        b[i] = j;
                        tag[j] = 1;
                        break;
                    }
                }
            }
            ans1 = ans1%f[n-i];
        }
    
        for (int i = 1;i <= n;i++){
            printf("%d ",b[i]);
        }
        return 0;
    }
    
    
    
    
  • 相关阅读:
    iOS截取长图,自定义截取size
    工作
    UITableView适配iOS11
    利用脚本实现build号自动加一
    iOS原生与JS互调
    CSS高级技巧
    伪元素选择器
    CSS设置过渡
    CSS文本属性 二
    css设置圆角矩形
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11635845.html
Copyright © 2011-2022 走看看