poj 1850

来源:互联网 发布:源码投稿 编辑:程序博客网 时间:2024/04/28 15:21


题意:这个题就是给你一个序列a,b,c,d,e,f.............z,ab,.........az,bc,......vwxyz

                                                  1,2,3,4,5,6            26,27......  51,52       83681

然后给你一个序列问你这个序列是第几个序列

下面看思路:

说这道题之前我先说一个神奇的东西,我们先来看一下杨辉三角

1

1     1

1     2    1

1     3    3    1

下面的我就不写了

我们可以发现他们每个值对应的xy坐标用组合来选择正好是对应的例如C2/2整好是1,C3/1整好是3

所以以后写组合的值我们可以用杨辉三角来打表

下面不墨迹解题:这道题 我们要分两步来求  先求出来从第一个到它这个长度的第一个中间有多少个,比如我们要求

vwxyz  我们需要先求出a到abcde之间有多少个然后再求出abcde到vwxyz之间有多少个

我们先来解决第一步:我们先看啊一位总共有C26/1个  两位有C26/2个  所以第一步我们就很容易解决了

第二步:我在程序中已经有明确说明下面看程序吧

#include<functional>#include<algorithm>#include<iostream>#include<fstream>#include<sstream>#include<iomanip>#include<numeric>#include<cstring>#include<cassert>#include<cstdio>#include<string>#include<vector>#include<bitset>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<list>#include<set>#include<map>using namespace std;int c[33][33] = {0};int bin[35];   //这个是用来存储最大内个二进制数的void zuhe(){    for(int i = 0;i < 33;i++)    {        for(int j = 0;j <= i;j++)        {            if(j == 0||i == j)            {                c[i][j] = 1;            }            else            {                c[i][j] = c[i - 1][j - 1] + c[i - 1][j];            }        }    }    return;}int main(){    char str[11];    zuhe();    int i;    while(~scanf("%s",str))    {        int len = strlen(str);        for(i = 1;i < len;i++)        {            if(str[i - 1] >= str[i])   //如果输入的不合理我们就直接结束比如aab  ba            {                printf("%d\n",0);                return 0;            }        }        int sum = 0;        for(i = 1;i < len;i++)    //这个地方就是求出从a到它的位数的 第一个中间有多少个        {            sum = sum + c[26][i];        }        for(i = 0;i < len;i++)    //i就是指出这个字符串中的第几个字母        {            char ch = (!i)?'a':str[i - 1] + 1;   //因为每一位的字母都是递增的 所以我们要从上一位加1开始            while(ch <= str[i] - 1)     //这一位还要小于下一位            {                sum = sum + c['z' - ch][len - i - 1];     //因为比ch小的字母不能用了  所以还剩下‘z’ - ch个字母 在这些中选出len - i - 1个                ch++;            }        }        printf("%d\n",sum + 1);   //因为我们之前算的是在给的字母之前有多少个  我们还得把给的这个字母算上所以+1    }    return 0;}


0 0
原创粉丝点击