foj 1571 排列的字典序问题
题目
使用next_permutation();函数
字典序值求法:
第i个数其后面比他小的个数乘上(n-i)!
之和就为字典序值
例如:
2 6 4 5 8 1 7 3
1*7!+4*6!+2*5!+2*4!+3*3!+0*2!+1*1!+0*0!=8227
#include<iostream>
#include<algorithm>//头文件
using namespace std;
int fun(int n){//阶层函数
int res=1;
for(int i=1;i<=n;i++){
res*=i;
}
return res;
}
int main()
{
int n,i,j,t=0,flag=0;
int sum=0,num=0;
int a[14];
while(cin>>n)
{
for(i=0;i<n;i++){
cin>>a[i];
}
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]) num++;
}
sum+=num*fun(n-i-1);
num=0;
}
cout<<sum<<endl;
sum=0;
next_permutation(a,a+n);//求下一个排列
for(i=0;i<n;i++){
cout<<a[i];
if(i!=n-1) cout<<" ";
}
cout<<endl;
}
return 0;
}
浙公网安备 33010602011771号