zoukankan      html  css  js  c++  java
  • 字母组合2

    字母A,B,C的所有可能的组合(按字典顺序排序)是:A, AB,ABC,AC,B,BC,C 每个组合都对应一个字典顺序的序号,如下所示:

                1 A

                2 AB

                3 ABC

                4 AC

                5 B

                6 BC

                7 C

          找出编号为K的字母组合。例如,上例中编号为4的组合为AC。

          注:假设某个字母组合为X1X2X3…XK,保证X1<…

          输入:输入包括2行:

          第一行:N,表示字母组合由字母表中前N(N<=26)个字母组成;

          第二行:K;

          输出:该字母组合;

          输入样例:

      3

           2

          输出样例: 

      AB

    分析:这道题和字母组合poj1850是同一类型的题,细节比较繁琐.方法就是枚举第i位放编号为几的字母,计算放了之后能组成多大编号的字母组合.根据这个范围来判断第i位到底放哪一个字母.

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n, k, num[30], tot, c[30][30];
    
    int main()
    {
        c[0][0] = 1;
        for (int i = 1; i <= 30; i++)
        {
            c[i][0] = 1;
            for (int j = 1; j <= 30; j++)
                c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
        }
        scanf("%d%d", &n, &k);
        while (k)
        {
            int ch, t = 0;
            if (tot == 0)
                ch = 1;
            else
                ch = num[tot] + 1;
            int temp = 0;
            while (ch <= n)
            {
                for (int j = tot; j <= n; j++)
                    temp += c[n - ch][j - tot];
                if (temp >= k)
                    break;
                t = temp;
                ch++;
            }
            k -= t + 1;
            num[++tot] = ch;
        }
        for (int i = 1; i <= tot; i++)
            printf("%c", num[i] - 1 + 'A');
    
        return 0;
    }
  • 相关阅读:
    查看mysql服务器连接
    读懂MySQL执行计划
    学会MySQL索引
    记一个有趣的Java OOM!
    高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
    如何优雅的使用mybatis
    禁止页面后退JS(兼容各浏览器)
    如何做一个对账系统
    centos7.2进入单用户模式修改密码
    linux系统引导流程
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7954540.html
Copyright © 2011-2022 走看看