nyoj166 小珂的数学题

来源:互联网 发布:局域网网络管理 编辑:程序博客网 时间:2024/04/29 20:00

题目:点击打开链接


题目大意:给定一个字符串,该字符串是升序的,问它是字符串中的第几个?

思路:只要算出该字符串前面有多少个就可以了,然后加一就是最终答案,这里麻烦的是求该字符串前面有多少个,分为两部分,一部分是字符串长度小于该字符串的,另一部分是长度等于该字符串的但在该字符串前面的字符串!由于是字符串是升序的,即是n个字母只能组合成一个序列,那就应该对应着n个字母的组合数!

 

这里用到了一个组合数学的公式:,跟杨辉三角有点类似!

上码:

#include<iostream>#include<string> using namespace std; int c[27][27]; void get_c(){for(int i=0;i<27;i++){for(int j=0;j<27;j++){if(i==j||j=0){c[i][j]=1;}else{c[i][j]=c[i-1][j]+c[i-1][j-1];}}}c[0][0]=0;//这是组合数跟杨辉三角的区别!!!} bool is_asc(string str){for(int i=1;i<str.size();i++){if(str[i]<=str[i-1]){return false;}}return true;} int main(){string str;int ans,len;while(cin>>str){if(!is_asc(str)){cout<<0<<endl;continue;}len=str.size();ans=0;for(int i=1;i<len;i++){//字符串长度小于len的个数ans+=c[26][i];}for(int i=0;i<len;i++){//每个字母都要考虑到//每个字母选定后,后面的可能个数for(char ch=(i?’a’:str[i-1]+1);ch<str[i];ch++){ans+=c[‘z’-ch][len-1-i];}}cout<<++ans<<endl;}return 0;}

0 0
原创粉丝点击