您的位置:首页 > 其它

fjnu 1358 排列的字典序问题

2008-03-24 16:47 267 查看
Description

问题描述:
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 }的一个排列,计算出这个排列的字典序值,以及按字
典序排列的下一个排列。

Input

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

Output

程序运行结束时,将计算出的排列的字典序值和按字典序排列的下一个排列输出。第一行是字典序值,第2行是按字典序排列的下一个排列。

Sample Input

8
2 6 4 5 8 1 7 3


Sample Output

8227
2 6 4 5 8 3 1 7


Hint

输出排列时,每个数后跟一个空格(包括最后一个数)


Source:




#include<iostream>


using namespace std;






int f[11]=...{1,1};


int a[11];


int n;


int flag[11];




void GetList()




...{


for(int i=2;i<=10;i++)


f[i]=f[i-1]*i;


}




void input()




...{


for(int i=1;i<=n;i++)




...{


cin>>a[i];


flag[i]=1;


}


}




int count_flag(int x)




...{


int count=0;


for(int i=1;i<x;i++)


if(flag[i]) count++;


return count;


}






int Rank()




...{


int i,j,k,t;


unsigned long sum=0;


for(i=1;i<=n;i++)




...{


t=count_flag(a[i]);


sum+=t*f[n-i];


flag[a[i]]=0;


}


return sum;


}




void NextOrder()




...{


int i=n-1;


while(a[i+1]<a[i]) i--;


int j=n;


while(a[j]<a[i]) j--;


int t;


t=a[i];


a[i]=a[j];


a[j]=t;


i=i+1;


j=n;


while(i<j)




...{


t=a[i];


a[i]=a[j];


a[j]=t;


i++;


j--;


}


}




void output()




...{


for(int i=1;i<=n;i++)


cout<<a[i]<<" ";


cout<<endl;


}




int main()




...{


// freopen("fjnu_1358.in","r",stdin);


GetList();


cin>>n;


input();


cout<<Rank()<<endl;


NextOrder();


output();


return 0;


}



















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: