poj 1850


题意:这个题就是给你一个序列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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值