蓝桥训练赛:排列序数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/85058975

 如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
  abcd  0
  abdc  1
  acbd  2
  acdb  3
  adbc  4
  adcb  5
  bacd  6
  badc  7
  bcad  8
  bcda  9
  bdac  10
  bdca  11
  cabd  12
  cadb  13
  cbad  14
  cbda  15
  cdab  16
  cdba  17    
  ...

现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?

【输入格式】
一行,一个串。

【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。

例如:
输入:
bdca

程序应该输出:
11

再例如:
输入:
cedab

程序应该输出:
70

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
bool algh[30]={false};
int main(int argc,char **argv)
{
	char temp[30]={0};
	scanf("%s",temp);
	int i,len=strlen(temp);
	for(i=0;i<len;i++)
		algh[temp[i]-'a'+1]=true;
	int ans=0;
	for(i=0;i<len-1;i++)
	{
		int j,nsp=1,isp=1;
		for(j=i+1;j<len;j++)
		{
			nsp*=isp;
			isp++;
		}
		int endp=0;
		for(j=temp[i]-'a';j>0;j--)
			if(algh[j]==true)
				endp++;
		algh[temp[i]-'a'+1]=false;
		ans+=endp*nsp;
	}
	printf("%d\n",ans);
	return EXIT_SUCCESS;
}

算是全排列的规律或者定义吧。

每一位需计算比它小的字母的个数*后面所有字母全排列的可能性。

如cedab

c:当前比它小的字母有 a、b     ——    2*4!=48

e:当前比它小的字母有 a、b、d     ——    3*3!=18

d:当前比它小的字母有 a、b     ——    2*2!=4

a:当前比它小的字母有      ——    0*1!=0

ans=48+18+4+0=70

如bdca

b:当前比它小的字母有 a     ——    1*3!=6

d:当前比它小的字母有 a、c     ——    2*2!=4

c:当前比它小的字母有 a     ——    1*1!=1

ans=6+4+1=11

END

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/85058975