• 【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;
    }
    
    
    
    
  • 相关阅读:
    建模:确定服务的边界——《微服务设计》读书笔记
    linux & windows下重启oracle
    Git配置用户名与邮箱
    Git中使用amend解决提交冲突
    微服务架构师的职责——《微服务设计读书笔记》
    MAC下配置ssh让SourceTree通过秘钥访问远程仓库
    微服务的概念——《微服务设计》读书笔记
    Uva 11572 唯一的雪花
    Codeforces Round #404 (Div. 2) ABC
    tyvj 1031 热浪 最短路
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11635845.html
Copyright © 2020-2023  润新知