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;
}

posted on 2017-04-08 00:36  linese-d  阅读(113)  评论(0)    收藏  举报

导航