NYOJ_139我排第几个

来源:互联网 发布:龙岗哪有学淘宝运营的 编辑:程序博客网 时间:2024/04/27 16:20

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

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

260726926


代码:

#include<iostream>#include<stdio.h>#include<string.h>#include<string>using namespace std;int fac[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600};int cant(int s[]){int sum = 0;for( int i = 0; i < 12; i++){int num = 0;for( int j = i + 1; j < 12; j++)if(s[i] > s[j])num ++;sum +=  num * fac[12 - i -1];}return sum + 1;}int main(){int n;cin>>n;while(n--){char s;int a[12];for( int i = 0; i < 12; i++){cin>>s;a[i] = s - '0';}int ans = cant(a);printf("%d\n",ans);}return 0;}

思路解析:

数学问题,康托展开公式的运用。

康托展开:实质是计算当前排列在所有由小到大全排列中的顺序。

X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0!





0 0
原创粉丝点击