我排第几个
来源:互联网 发布:金蝶软件苏州分公司 编辑:程序博客网 时间:2024/04/27 15:54
我排第几个
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?
- 输入
- 第一行有一个整数n(0<n<=10000);
随后有n行,每行是一个排列; - 输出
- 输出一个整数m,占一行,m表示排列是第几位;
- 样例输入
3abcdefghijklhgebkflacdjigfkedhjblcia
- 样例输出
1302715242260726926
- 来源
- [苗栋栋]原创
- 上传者
苗栋栋
思路:
刚开始根本没思路,所以就想打表找规律,结果根本没办法找。。。最后去看看讨论区,发现原来要用到康托展开公式。
AC代码:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<string>using namespace std;typedef long long ll;string s;ll sum(int i){ll cnt=0,k=s[i]-'a';while(++i<12){if(k>s[i]-'a')cnt++;}return cnt;}int main(){/*freopen("input.txt","r",stdin);*/int n,i;ll cnt;int a[15]={39916800,3628800,362880,40320,5040,720,120,24,6,2,1};cin >> n;while(n--){cnt=0;cin >> s;for(i=0;i<11;++i){cnt+=sum(i)*a[i];}cout << cnt+1 << endl;}return 0;}
优秀代码:#include<cstdio>const int Fact[13]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};int getTh(char code[],int n){int sum=0;for(int i=0;i!=n;i++){ int rev=0;for(int j=i+1;j<n;j++)rev+=(code[i]>code[j]);sum+=rev*Fact[n-1-i]; //Fact[i]表示i的阶乘。}return sum;}int main(){int n;char str[15];scanf("%d",&n);while(n--){scanf("%s",str);printf("%d\n",getTh(str,12)+1);}}
0 0
- 我排第几个?
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- 我排第几个
- NYOJ - 我排第几个
- 139 我排第几个
- acm-我排第几个
- NYOJ_139我排第几个
- 139 我排第几个
- iOS开发学习之UIScrollerView实现新特性
- 4Sum(****) 基于3Sum
- 消息与通知机制
- Android之项目中如何用好构建神器Gradle?
- MongoDB入门学习笔记之简介与安装配置
- 我排第几个
- 基于jquery1.4.2的百度地图标点demo-----ajax更改后台地图坐标数据
- IOS基础UI之(三)手写UI和storyboard方式实现图片移动和缩放
- CentOS下安装软件的方法
- 《暗时间》读书笔记
- C语言基础知识之(十六):结构体和指针
- HDU 5154 Harry and Magical Computer(找环)
- Hadoop系列之单机版安装
- POST请求的两种格式