• 蓝桥杯 第 1 场算法双周赛 第2题 数树数【算法赛】c++ 位运算巧解


    题目

    数树数【算法赛】icon-default.png?t=N7T8https://www.lanqiao.cn/problems/5128/learning/?contest_id=144

    难度: 中等

    问题描述

    小蓝最近学了二叉树,他想到了一个问题。

    给定一个层数为 n 的满二叉树,每个点编号规则如下:

    图片描述

    具体来说,二叉树从上向下数第 p 层,从左往右编号分别为: 1,2,3,4...2p−1 。

    小蓝给你一条从根节点开始的路径,他想知道到达的节点编号是多少。

    例如:路径是 right−left ,那么到达的节点是 1−2−31−2−3 ,最后到了三号点,如下图所示。

    图片描述

    输入格式

    第一行输入两个整数 n,q ,n 表示完全二叉树的层数,q 代表询问的路径数量。

    接下来 q 行,每行一个字符串 S ,S 只包含字符 { 'L','R' },'L' 代表向左,R 代表向右。

    输出格式

    输出 q 行,每行输出一个整数,代表最后到达的节点编号。

    样例输入

    1. 3 6
    2. R
    3. L
    4. LL
    5. LR
    6. RL
    7. RR

    样例输出

    1. 2
    2. 1
    3. 1
    4. 2
    5. 3
    6. 4

    说明

    2≤n≤20,1≤q≤103,1≤∣S∣

    完全二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 K ,且节点总数是 2−12k−1 ,则它就是满二叉树。

    运行限制

    语言最大运行时间最大运行内存
    C++1s256M
    C1s256M
    Java2s256M
    Python33s256M
    PyPy33s256M

    总通过次数: 1733  |  总提交次数: 2262  |  通过率: 76.6%

    思路和解题方法

    1. #include :包含输入输出流库,提供与标准输入输出设备的接口。
    2. #include :包含字符串处理函数库,提供对字符串的操作。
    3. #include :包含算法函数库,提供各种常用的算法操作。
    4. #include :包含数学函数库,提供各种常用的数学函数。
    5. int n, q, a;:声明整型变量n,q,a,用于存储输入的值和中间结果。
    6. char s[50];:声明字符数组s,用于存储输入字符串。
    7. using namespace std;:使用std命名空间,简化对标准库的调用。
    8. int main():主函数,程序的入口。
    9. cin >> n >> q;:从标准输入读取两个整数,分别赋值给变量n和q。
    10. for (int i = 0; i < q; i++) { ... }:循环q次,执行查询操作。
    11. cin >> s;:从标准输入读取一个字符串,赋值给字符数组s。
    12. a = 1;:将变量a初始化为1。
    13. for (int j = 0; j < strlen(s); j++) { ... }:遍历字符串s的每个字符,进行二叉树的计算。
    14. if (s[j] == 'L') ... else ...:根据当前字符是'L'还是'R',更新变量a的值。
    15. cout << a << endl;:输出最终得到的a值。
    16. return 0;:返回0,表示程序正常结束。

    复杂度

            时间复杂度:

                    O(q * strlen(s))

    时间复杂度为O(q * strlen(s)),其中q是查询次数,strlen(s)是每个查询字符串的长度。

            空间复杂度

                    O(1)

    空间复杂度为O(1),除了输入变量和常量大小的额外内存开销外,没有使用其他额外的动态内存。

    c++ 代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. int n, q, a; // 声明变量n,q,a
    6. char s[50]; // 声明字符数组s
    7. using namespace std;
    8. int main() {
    9. cin >> n >> q; // 输入变量n和q
    10. for (int i = 0; i < q; i++) { // 循环q次,执行查询操作
    11. cin >> s; // 输入字符串s
    12. a = 1; // 初始化变量a为1
    13. for (int j = 0; j < strlen(s); j++) { // 遍历字符串s的每个字符
    14. if (s[j] == 'L') // 如果当前字符是'L'
    15. a = 2 * (a - 1) + 1; // 更新a为左子节点的值
    16. else // 否则当前字符是'R'
    17. a = 2 * (a - 1) + 2; // 更新a为右子节点的值
    18. }
    19. cout << a << endl; // 输出最终得到的a值
    20. }
    21. return 0;
    22. }

    觉得有用的话可以点点赞,支持一下。

    如果愿意的话关注一下。会对你有更多的帮助。

    每天都会不定时更新哦  >人<  。

  • 相关阅读:
    Lsky Pro+云服务器搭建私人图床
    会议OA项目----我的审批
    关于需求管理之我见
    Java回顾-String/StringBuilder/StringBuffer
    PCA降维代码实现
    Java的interface应用和面向接口编程
    RabbitMQ------简单队列模式以及工作队列模式以及消息应答的方式(三)
    2022年最新《谷粒学院开发教程》:8 - 前台登录功能
    QT—3D绘图
    内核编译 --- 链接器
  • 原文地址:https://blog.csdn.net/jgk666666/article/details/133831569