• Code(组合数学)


    Code
    Time Limit: 1000MS Memory Limit: 30000K
    Total Submissions: 8766 Accepted: 4168

    Description
    Transmitting and memorizing information is a task that requires different coding systems for the best use of the available space. A well known system is that one where a number is associated to a character sequence. It is considered that the words are made only of small characters of the English alphabet a,b,c, …, z (26 characters). From all these words we consider only those whose letters are in lexigraphical order (each character is smaller than the next character).

    The coding system works like this:
    • The words are arranged in the increasing order of their length.
    • The words with the same length are arranged in lexicographical order (the order from the dictionary).
    • We codify these words by their numbering, starting with a, as follows:
    a - 1
    b - 2

    z - 26
    ab - 27

    az - 51
    bc - 52

    vwxyz - 83681

    Specify for a given word if it can be codified according to this coding system. For the affirmative case specify its code.

    Input
    The only line contains a word. There are some constraints:
    • The word is maximum 10 letters length
    • The English alphabet has 26 characters.

    Output
    The output will contain the code of the given word, or 0 if the word can not be codified.

    Sample Input

    bf

    Sample Output

    55

    Source
    Romania OI 2002
    大神博客

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <map>
    #include <algorithm>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    typedef long long LL;
    
    const int MAX = 1e5+10;
    
    int Bin[35];
    
    int c[33][33];
    
    char str[20];
    
    char ch;
    
    void ComBinnations()//打表,计算组合数
    {
        for(int i=0; i<=32; i++)
        {
            for(int j=0; j<=i; j++)
            {
                if(!j||i==j)
                {
                    c[i][j]=1;
                }
                else
                {
                    c[i][j]=c[i-1][j]+c[i-1][j-1];
                }
            }
        }
        c[0][0]=0;
    }
    int main()
    {
        int sum;
        bool flag;
        ComBinnations();
        scanf("%s",str);
        int len=strlen(str);
        flag=false;
        for(int i=1; i<len; i++)//判断是否是合法字符
        {
            if(str[i-1]>=str[i])
            {
                printf("0
    ");
                flag=true;
                break;
            }
        }
        if(!flag)
        {
            sum=0;
            for(int i=1; i<len; i++)//计算比它小的字母排列
            {
                sum+=c[26][i];
            }
            for(int i=0; i<len; i++)//计算长度相等是字符的个数
            {
                ch=!i?'a':str[i-1]+1;
                while(ch<str[i])
                {
                    sum+=c['z'-ch][len-i-1];
                    ch++;
                }
            }
            printf("%d
    ",sum+1);//加上本身
        }
        return 0;
    }
    
  • 相关阅读:
    [速记]关于指针,引用和递归和解递归——C++
    查找(二)——基于二叉排序树的查找
    查找总结(一)-----简单查找和折半查找
    jdk代理和cglib代理
    IOC和AOP使用扩展 多种方式实现依赖注入
    InputStream和Reader
    Spring IoC
    Spring AOP(aspect oriented programming) 转载
    数据校验与国际化
    Struts2 之 实现文件上传(多文件)和下载
  • 原文地址:https://www.cnblogs.com/juechen/p/5255963.html
Copyright © 2020-2023  润新知