POJ1850&&POJ1496

来源:互联网 发布:系统工程师 软件开发 编辑:程序博客网 时间:2024/05/20 09:20

POJ1850

/****************************http://poj.org/problem?id=18501.先通过计算分别得到每一位数(这儿的位数是指字符片段的长度)对应的第一个片段的序号,在此基础上,同位数的片段是一个递增的过程,通过计算得到int num[]= {0,26,325,2600,14950,65780,230230,657800,1562275,3124550,5311735};2.对于题意中明确说了的升序,可以通过一个标志变量来判断,直接用片段长度即可,当片段不是升序时,使其长度变成-13.C(m,n)=C(n-1,m-1)+C(n-1,m);4.把一个大的字符串分理处几个字符串,比如说字符串长度为5,那么分成两部分,第一部分为长度1到4的和,此时sum=C(26,1)+C(26,2)+C(26,3)+C(26,4).第二部分对应于每一位下于该位符号对应的字符串个数****************************/#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>using namespace std;int num[]= {0,26,325,2600,14950,65780,230230,657800,1562275,3124550,5311735};int combine(int n,int m)//组合数的计算方法{    int ans=1;    for(int i=1; i<=m; i++)        ans=ans*(n-i+1)/i;    return ans;}int main(){    //freopen("C:\\Users\\Administrator\\Desktop\\in.txt" , "r" , stdin);    char str[11];//输入的片段    int len;//片段长度    int sum;//总和    int p;    while(scanf("%s",str)!=EOF)    {        sum=0;        len=strlen(str);        //cout<<"len="<<len<<" ";        for(int i=1; i<len; i++)//在位数的基础上找首个片段所在        {            sum+=num[i];            //cout<<"sum="<<sum<<" ";            if(str[i]<str[i-1])//非升序的情况            {                len=-1;                sum=0;            }        }        if(len==-1)        {            printf("0\n");            continue;        }        for(int i=0;i<len;i++)//把一个片断分离成多个片段的组成,在这儿是分成一个一个的        {            if(i)p=str[i-1]-'a'+1;            else p=0;            //cout<<p<<endl;            for(int j=p;j<str[i]-'a';j++)            {                sum+=combine(25-j,len-i-1);            }            //cout<<sum<<endl;        }        cout<<sum+1<<endl;    }    return 0;}

POJ1496

//http://poj.org/problem?id=1496#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>using namespace std;int num[]= {0,26,325,2600,14950,65780,230230,657800,1562275,3124550,5311735};int combine(int n,int m){    int ans=1;    for(int i=1; i<=m; i++)        ans=ans*(n-i+1)/i;    return ans;}int main(){    freopen("C:\\Users\\Administrator\\Desktop\\in.txt" , "r" , stdin);    char str[11];    int len;    int sum;    int p;    while(scanf("%s",str)!=EOF)    {        sum=0;        len=strlen(str);        for(int i=1; i<len; i++)        {            sum+=num[i];            if(str[i]<str[i-1])            {                len=-1;                sum=0;            }        }        if(len==-1)        {            printf("0\n");            continue;        }        for(int i=0;i<len;i++)        {            if(i)p=str[i-1]-'a'+1;            else p=0;            for(int j=p;j<str[i]-'a';j++)            {                sum+=combine(25-j,len-i-1);            }        }        cout<<sum+1<<endl;    }    return 0;}


原创粉丝点击