zoukankan      html  css  js  c++  java
  • nyoj139——康托展开

    我排第几个

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?

     
    输入
    第一行有一个整数n(0<n<=10000);
    随后有n行,每行是一个排列;
    输出
    输出一个整数m,占一行,m表示排列是第几位;
    样例输入
    3
    abcdefghijkl
    hgebkflacdji
    gfkedhjblcia
    样例输出
    1
    302715242
    260726926

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long  ll;
    const int maxn = 1000000;
    const int moder = 1000000;
    
    //阶乘
    
    int fac[12] = {39916800,3628800,362880,40320,5040,720,120,24,6,2,1,1};
    
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            string s1;
            cin >> s1;
            ll res = 0;
            int a[12];
            for(int i=0;i < 12;i++){
                a[i] = s1[i] - 'a';
            }
            for(int i=0;i < 12;i++){
                int cnt = 0;
                for(int j=i+1;j < 12;j++){
                    if(a[j] < a[i]) cnt++;
                }
                res += fac[i]*cnt;
            }
            printf("%lld
    ",res+1);
        }
        return 0;
    }

    ——很痛苦,有点难,每次向后找比自己小的数的个数,然后乘以对应的阶乘

  • 相关阅读:
    剑指Offer_编程题_包含min函数的栈
    剑指Offer_编程题_顺时针打印矩阵
    Docker基础(3) 数据卷
    Docker基础(2) 实践篇
    Docker基础(1) 原理篇
    《算法》笔记 17
    《算法》笔记 16
    《算法》笔记 15
    《算法》笔记 14
    《算法》笔记 13
  • 原文地址:https://www.cnblogs.com/cunyusup/p/8586580.html
Copyright © 2011-2022 走看看