原题地址:

http://ac.jobdu.com/problem.php?pid=1113
(由于原始版面的排版实在有些不好看,所以就不贴过来啦。CSDN旧版的编辑器适应不了,这次尝试用markdown写)

解题思路

题意:给定一棵共有节点数为n的完全二叉树,对它每一层的节点从左到右编号,第一层为1,第二层为2、3,第三层为4、5、6、7……然后输入一个编号m,求以m为根的子树下共有多少节点。

  • 通过观察该树状图和完全二叉树的性质,容易得到一下结论:如果序号为m的节点存在子树,那么它左子树根节点的序号为2m,右子树根节点的序号为2m+1
  • 以此类推,该节点下面第k层最左节点(若存在)的序号为2k*m,最右节点的序号由该层是否满决定,如果该层是满的,那么最右节点的序号为2k*m+2k,否则和n的大小有关。
  • 因此,根据这个规律就不必构造一棵完全二叉树,直接对序号空间做处理。

注意点

第一次提交时出现Time Limit Exceed超时错误,原因是while循环中用了以下的for循环:

for (i = m*iter; i<=n && i <= m*iter+(iter-1); ++i) //某一层遍历cnt++;

即在该层满的情况下依然遍历,效率极低,必须对这种情况剪枝。(当时太愚蠢了,只需要一个if就能解决,何必要用for呢?)

AC代码:

#include <iostream>
using namespace std;int main() //完全二叉树问题可以用数组、树状图的规律解决,不必构造节点
{int m,n;while (cin >> m >> n){if (!m && !n) break;int iter = 1, cnt = 0; //iter记录m子树的第iter层while (m*iter <= n) //存在该层最左的节点{int i;int fullNum = m*iter+(iter-1);if (n >= fullNum) //该层全部都存在,直接累加,否则超时{cnt += iter;}else //该层不全{cnt += n-m*iter+1;}iter <<= 1;}cout << cnt << endl;}return 0;
}

内存占用: 1520Kb 耗时:0ms
算法复杂度:O(logn)

转载于:https://www.cnblogs.com/lecholin/p/6705278.html

九度OJ 1113 二叉树(完全二叉树)相关推荐

  1. 打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...

    题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最 ...

  2. Freckles - 九度 OJ 1144

    Freckles - 九度 OJ 1144 题目 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: In an episode of the Dick Van Dyke show, l ...

  3. 非常可乐(九度 OJ 1457)

    非常可乐(九度 OJ 1457) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 1.题目描述: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是 seeyou 却不这么认为.因为每次当 see ...

  4. 九度OJ 题目1179:阶乘

    /********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1179:阶乘 * 来源:http://ac.jo ...

  5. 九度OJ——1028继续畅通工程

    题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修 ...

  6. Leagal or Not - 九度 OJ 1448

    Leagal or Not - 九度 OJ 1448 题目 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: ACM-DIY is a large QQ group where man ...

  7. 九度OJ 题目1069:查找学生信息 随笔

    ** 九度OJ 题目1069:查找学生信息 ** 题目描述如下: 输入N个学生的信息,然后进行查询. 输入 输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息 ...

  8. 九度OJ 题目1203:IP地址

    /********************************* * 日期:2013-2-8 * 作者:SJF0115 * 题号: 九度OJ 题目1203:IP地址 * 来源:http://ac. ...

  9. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有 ...

最新文章

  1. linux的strace命令
  2. 2015湖南省省赛 阶乘除法 暴力
  3. 下载和安装Nginx之普通的HTTP和HTTPS服务器
  4. 豆瓣评分 9.3 的 Java 巨著 | Bruce Eckel 重讲 Java 的编程思想
  5. 在Heroku上扩展ipify服务
  6. 开工的欲望 | AI Studio上线新功能,用你的模型生成在线预测服务
  7. UVA - 10934 Dropping water balloons(装满水的气球)(dp)
  8. 清华网红自行车火了!背后是登在《自然》上的黑科技
  9. 编程通用知识 乘法除法位移
  10. A股开盘:深证区块链50指数涨0.51%,中远海科、广州浪奇涨停
  11. 05 基本数据类型+五大数据类型
  12. 解决jquery中全选点击第二次不生效的问题与分析
  13. 我的世界玩服务器虚拟内存高崩,我的世界:MC“游戏崩溃”的7种玩法,敢不敢在你的存档试一下?...
  14. JAVA API中文在线帮助文档
  15. AXURE 8.1.0.3382 有效激活码
  16. winform直接控制云台_大疆DJI RSC2相机云台评测:折叠设计带来更多玩法
  17. php劳保管理系统,《劳保用品管理系统》用盟威快速开发平台开发的应用实例
  18. 中国芝麻市场竞争规模及销售渠道分析报告2022-2028年版
  19. opencv之c++环境搭建linux、windows
  20. C++ Beep()演奏简谱的改进以及实现背景音乐

热门文章

  1. html禁用选择,html – 设置可选的禁用属性
  2. 递归法:财务金额漏掉1笔或者几笔(排列组合)
  3. 2018青岛ICPC ZOJ 4062: Plants vs. Zombies(二分)
  4. C++ STL 函数partial_sum的正确使用方法
  5. 1180魔方阵(每日学习)宁波大学OJ
  6. [机器学习] focal loss:解决样本不平衡的一种通用方案
  7. python基础系列教程——python中的字符串和正则表达式全解
  8. java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作
  9. python实现将文件下内每张图片按顺序命名为txt文本文件中的内容
  10. html状态码206,HTTP状态码206