南邮 OJ 1214 排列的字典序问题

来源:互联网 发布:mac沙盒机制 编辑:程序博客网 时间:2024/06/08 14:54

排列的字典序问题

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 117            测试通过 : 32 

比赛描述

n个元素{1,2,..., n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6个不同排列的字典序值如下:

字典序值  0      1      2      3       4      5

排列       123    132   213  231  312   321

给定n 以及n 个元素{1,2, …, n }的一个排列,计算出这个排列的字典序值,以及按字典序排列的下一个排列。



输入

输入数据的第1行是元素个数n。接下来的1 行是n个元素
{1,2, …, n }的一个排列。

输出

输出计算出的排列的字典序值和按字典序排列的下一个 ,第1行是字典序值,第2行是按字典序排列的下一个排列。 

样例输入

8
2 6 4 5 8 1 7 3

样例输出

8227
2 6 4 5 8 3 1 7

题目来源

算法设计与实验题解



#include<iostream>#include<algorithm>using namespace std;int main(){long long factorial[13]={0,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600};long long sum=0;bool used[13]={0};int n,i,j,k,a[13];cin>>n;for(i=0;i<n;++i){cin>>a[i];used[a[i]] = 1;for(j=1,k=0;j<a[i];++j){if(!used[j]){++k;}}sum += k*factorial[n-1-i];}cout<<sum<<endl;next_permutation(a,a+n);for(i=0;i<n;++i){cout<<a[i]<<" ";}}






0 0