原题链接:蓝桥杯2014年第五届真题-排列序数
解题思路:
思路1:暴力排列,运用STL中的next_permutation函数
#include <cstdio> #include <algorithm> #include <iostream> #include <string> using namespace std; int main(){ string s; cin>>s; string str=s; unsigned int res=0; sort(s.begin(),s.end()); do { if(s==str) break; res++; }while(next_permutation(s.begin(),s.end())); printf("%u",res); return 0; }
思路2:康托展开
阶乘可以打一个表,也可写一个函数
#include <cstdio> #include <algorithm> #include <string> #include <iostream> using namespace std; int fac[12]={1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800}; //寻找比当前元素更小的且在后面的元素 int smaller(string s,int index) { int res=0; for(int i=index;i<s.length();i++) { if(s[i]<s[index]) res++; } return res; } int main(){ string s; cin>>s; int len=s.length(),res=0,sum=0; for(int i=0;i<len;i++) { sum=smaller(s,i); res+=sum*fac[len-i-1]; } printf("%d",res); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复