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
- NYOJ_139我排第几个
- 我排第几个?
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- NYOJ - 我排第几个
- 139 我排第几个
- acm-我排第几个
- 139 我排第几个
- 开始学数据结构——(五):二分查找 ,递归
- 我们需要你
- Linux内核系统定时器TIMER实现过程分析
- 二叉搜索树和双向链表
- Android中ProgressDialog的用法
- NYOJ_139我排第几个
- 第四章作业
- 根据qt工程pro生成工程
- IOS 开发 手势使用
- 第六周作业1——利用哈夫曼编码英文字母表
- QT 对话框数据传递
- java开发命名规范
- 装系统提示“缺少所需的CD/DVD驱动器设备驱动程序”
- 基于Kinect手势跟踪和识别