蓝桥杯 排列序数 【全排列 / 康拓展开】

解题思路

花里胡哨的,10! = 3628800,这么少的数, 先从小到大排序,然后一个next_permutation函数就完事了.

但是n要是20呢? 全排列必然不行,那么就需要用到 康拓展开了。

介绍一下康拓展开:https://blog.csdn.net/Hi_KER/article/details/81263889

Code

全排列:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	cout << ans << endl;
	string t;
	char a[12];
	cin >> t;
	int len = t.size();
	for(int i=0;i<len;i++)
		a[i] = 'a'+i;
	a[len] = '\0';
	int k=0;
	string p;
	do {
		p = a;
		k++;
		if(p == t) {
			cout << k-1 << endl;
			break;
		}
	}while(next_permutation(a,a+len));
} 

康拓展开:

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int pre[12]={1};
	for(int i=1;i<=10;i++)
		pre[i] = pre[i-1]*i;
	char a[12];
	cin >> a+1;
	int len = strlen(a)-1;
	int ans = 0;
	for(int i=1;i<=len;i++) {
		int k = 0;
		for(int j=i+1;j<=len;j++)
			if(a[j] < a[i])	k++;
		ans += k*pre[len-i];
	}
	cout << ans << endl;    //其实ans的值是比a的字典序小的串的个数,但是因为下标是从0开始的,因此就正好是a的字典序
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值