QDUOJ 26 - 排在第几个
来源:互联网 发布:剑三温柔花哥捏脸数据 编辑:程序博客网 时间:2024/06/11 16:59
排在第几个
发布时间: 2015年10月10日 18:05 时间限制: 1000ms 内存限制: 256M
描述
现在有”abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
输入
每行输入一行字符串,保证是a~l这12个字符的某种排列 EOF结束
输出
输出一个整数,代表这个排列排在第几位
样例输入1 复制
abcdefghijkl
abcdefghiklj
gfkedhjblcia
样例输出1
1
4
260726926
给你一个集合,然后将所有的元素进行全排列。如果要是打表的话,要存n!个。
康托展开的话,就是看当前排列是全排列的第几小。
康托展开实际上是一种特殊的哈希函数,他的应用是对n个数的排列进行状态的压缩和存储。
这个题中,其第几小的公式就是:
(当前位置)! * 比这个当前数小且没在之前使用过的数的个数(因此需要多开辟一个数组,进行备忘,记录下哪个数出现过),然后求和。
AC代码
#include<stido.h>int main(){ char qdu[12]; int factory[12]; int i; int j; for(i = 0;i < 12;i++) { int temp = 1; for(j = 1;j <= i;j++) temp *= j; factory[i] = temp; } factory[0] = 0; while(~scanf("%s",&qdu)) { int centor[12] = {0}; int res = 0; for(i = 0;i < 12;i++) { centor[qdu[i]-'a'] = 1; int cnt = 0; for(j = 0;j < qdu[i]-'a';j++) if(!centor[j]) cnt++; res += factory[11-i]*cnt; } printf("%d\n",res+1); } return 0;}
0 0
- QDUOJ 26 - 排在第几个
- qduoj 排在第几个
- qduoj 26 排在第几个 康拓展开
- 我排第几个?
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- NYOJ - 我排第几个
- 20160722(B) 内部类/Object/equal() 比较/(静态)内部类的特点/面试题/局部内部类/匿名内部类/接口的例子/题目
- 创建临时表空间组
- AndroidStudio mipmap图片大小
- iOS 图形编程总结
- kvo的底层实现
- QDUOJ 26 - 排在第几个
- 最短路径
- Android 4.4以下Listview addHeadView不显示
- Codeforces Round #123 (Div. 2) B - After Training
- iOS OC调用JavaScrip
- 网址收藏
- Ihtmldocument2接口
- Linux常用命令详解文库
- Android 布局优化