• poj1850——组合数学


    poj1850——组合数学

    Code
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 8492   Accepted: 4020

    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

    题意:对递增的字符串,输出次序,非递增则输出0
    思路:排列组合
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    
    const int maxn=1000100;
    const int INF=(1<<28);
    
    string str;
    int code;
    int C[30][30];
    
    void creat_C()
    {
        memset(C,0,sizeof(C));
        for(int i=0;i<=28;i++){
            for(int j=0;j<=i;j++){
                if(j==0||j==i) C[i][j]=1;
                else C[i][j]=C[i-1][j-1]+C[i-1][j];
            }
        }
    }
    
    int main()
    {
        creat_C();
        cin>>str;
        for(int i=0;i<str.length()-1;i++){
            if(str[i]>=str[i+1]){
                cout<<0<<endl;
                return 0;
            }
        }
        code=0;
        int len=str.length();
        for(int i=1;i<=len-1;i++){
            code+=C[26][i];
        }
        for(int i=0;i<len;i++){
            char ch=i?str[i-1]+1:'a';//ch至少要比前一个大
            for(;ch<str[i];ch++){
                code+=C['z'-ch][len-i-1];
            }
        }
        cout<<code+1<<endl;
        return 0;
    }
    View Code
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    MySql数据库水平扩展过程
    (转)MySQL数据库水平切分的实现原理解析
    SVN安装使用
    servlet基础
    数据库读写分离的性能分析
    java的可变长参数
    java消息服务
    static/final成员与多态
    商业软件与开源软件
    托管堆
  • 原文地址:https://www.cnblogs.com/--560/p/4361311.html
Copyright © 2020-2023  润新知