nyoj139--我排第几个 (康拓展开)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj139--我排第几个 (康拓展开)相关的知识,希望对你有一定的参考价值。
我排第几个
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
- 输入
- 第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列; - 输出
- 输出一个整数m,占一行,m表示排列是第几位;
- 样例输入
-
3 abcdefghijkl hgebkflacdji gfkedhjblcia
- 样例输出
-
1 302715242 260726926
- 来源
- [苗栋栋]原创
- 上传者
- 苗栋栋
- 懵B;
-
#include <cstdio> #include <cstring> int a[15]; void deal() { a[1]=1; for(int i=2; i<=12; i++) a[i]=a[i-1]*i; } int main() { deal(); int t;scanf("%d", &t); while(t--) { char str[15]; scanf("%s", str); int len=strlen(str); int rec =0; for(int i=0; i<len; i++) { int count=0; for(int j=i+1; j<len; j++) if(str[j]<str[i]) count++; rec+= count*a[len-1-i]; } printf("%d\\n", rec+1); } return 0; }
#include <cstdio> #include <cstring> int jc[13]={0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600}; int main() { char normal[13]="abcdefghijkl"; int t; scanf("%d", &t); while(t--) { int v[13]; memset(v, 0, sizeof(v)); char str[13]; scanf("%s", str); int len=strlen(str); int sum=0; for(int i=0; i<len; i++) { v[str[i]-‘a‘]=1; if(str[i]-normal[i]==0) { continue; } else { int d=0; int p=str[i]-‘a‘; for(int k=p-1; k>=0; k--) if(v[k]==0) d++; int j=i+1; int t=12-j; //printf("%d\\n", j+t); sum=sum+d*jc[t]; } } printf("%d\\n", sum+1); } return 0; }
以上是关于nyoj139--我排第几个 (康拓展开)的主要内容,如果未能解决你的问题,请参考以下文章