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

题目

数树数【算法赛】https://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 行,每行输出一个整数,代表最后到达的节点编号。

样例输入

复制代码
3 6
R
L
LL
LR
RL
RR

样例输出

复制代码
2
1
1
2
3
4

说明

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

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

运行限制

语言 最大运行时间 最大运行内存
C++ 1s 256M
C 1s 256M
Java 2s 256M
Python3 3s 256M
PyPy3 3s 256M

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

思路和解题方法

  1. #include <iostream>:包含输入输出流库,提供与标准输入输出设备的接口。
  2. #include <cstring>:包含字符串处理函数库,提供对字符串的操作。
  3. #include <algorithm>:包含算法函数库,提供各种常用的算法操作。
  4. #include <cmath>:包含数学函数库,提供各种常用的数学函数。
  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++ 代码

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

int n, q, a; // 声明变量n,q,a
char s[50]; // 声明字符数组s

using namespace std;

int main() {
    cin >> n >> q; // 输入变量n和q

    for (int i = 0; i < q; i++) { // 循环q次,执行查询操作
        cin >> s; // 输入字符串s
        a = 1; // 初始化变量a为1

        for (int j = 0; j < strlen(s); j++) { // 遍历字符串s的每个字符
            if (s[j] == 'L') // 如果当前字符是'L'
                a = 2 * (a - 1) + 1; // 更新a为左子节点的值
            else // 否则当前字符是'R'
                a = 2 * (a - 1) + 2; // 更新a为右子节点的值
        }

        cout << a << endl; // 输出最终得到的a值
    }

    return 0;
}

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

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

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

相关推荐
努力毕业的小土博^_^1 分钟前
【EI/Scopus双检索】2025年4月光电信息、传感云、边缘计算、光学成像、物联网、智慧城市、新材料国际学术盛宴来袭!
人工智能·神经网络·物联网·算法·智慧城市·边缘计算
神里流~霜灭22 分钟前
数据结构:二叉树(三)·(重点)
c语言·数据结构·c++·算法·二叉树·红黑树·完全二叉树
网安秘谈24 分钟前
非对称加密技术深度解析:从数学基础到工程实践
算法
luckyme_29 分钟前
leetcode-代码随想录-哈希表-有效的字母异位词
算法·leetcode·散列表
小王努力学编程34 分钟前
【Linux系统编程】进程概念,进程状态
linux·运维·服务器·c++
zh_xuan37 分钟前
LeeCode 57. 插入区间
c语言·开发语言·数据结构·算法
2401_8534482342 分钟前
C嘎嘎类里面的额函数
c语言·开发语言·c++
莫有杯子的龙潭峡谷1 小时前
4.4 代码随想录第三十五天打卡
c++·算法
luckyme_1 小时前
leetcode 代码随想录 数组-区间和
c++·算法·leetcode
巷北夜未央1 小时前
数据结构之二叉树Python版
开发语言·数据结构·python