HDU 5573 Binary Tree【构造】
2016-04-27 21:57
239 查看
几天前模拟区域赛的一道题,今天发现在草稿箱里直接补个博客。
感觉这还是一道很有意思的构造题。
那么实际上这个过程就类似整数的二进制表示,1表示加,0表示减,如果该位为0,那么意味着在2k+1−1的基础上减去了二倍改为代表的数,所以我们求出n与2k+1−1的差,将差的一半的二进制中为1的位置为0即可~~
注意偶数的时候,差为奇数,那么我们将差多加个一,让最后一步走右边的结点,即加一即可。
感觉这还是一道很有意思的构造题。
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5573题意:
给你一个二叉树,根节点为1,子节点为父节点的2倍和2倍+1,从根节点开始依次向下走k层,问如何走使得将路径上的数进行加减最终结果得到n。分析:
首先明确由1.2.4...2k可以构造出所有小于2k+1的数,那么实际上只要走2的幂次即最左边的结点即可。那么实际上这个过程就类似整数的二进制表示,1表示加,0表示减,如果该位为0,那么意味着在2k+1−1的基础上减去了二倍改为代表的数,所以我们求出n与2k+1−1的差,将差的一半的二进制中为1的位置为0即可~~
注意偶数的时候,差为奇数,那么我们将差多加个一,让最后一步走右边的结点,即加一即可。
代码:
#include<iostream> #include<cstring> using namespace std; typedef long long ll; const int maxn = 60 +5; int a[maxn]; int main (void) { int t;cin>>t; int cnt = 0; while(t--){ int n, k;cin>>n>>k; cnt++; cout<<"Case #"<<cnt<<":"<<endl; ll all = 1<<(k+1) - 1; bool flg = false; if(n % 2 == 0){flg = true;n--;} ll res = (all - n) / 2; for(int i = 0; i < k - 1; i++){ ll tmp = 1<<i; if(res&1) cout<<tmp<<" -"<<endl; else cout<<tmp<<" +"<<endl; res = res>>1; } ll tmp = 1<< (k - 1); if(flg) cout<<tmp + 1<<" +"<<endl; else cout<<tmp<<" +"<<endl; } return 0; }
相关文章推荐
- 过滤器
- 《啊哈算法》第四章 万能的搜索之着色法
- WebBasic01-HTML
- 开发测试时给 Kafka 发消息的 UI 发送器――Mikasa
- 单例
- android 常用单词
- Mysql数据库的优化技术
- leetcode-125. Valid Palindrome
- (4.6.11.5)基于Facebook Buck改造Android构建系统之初体验
- BZOJ4069: [Apio2015]巴厘岛的雕塑
- EntityFrameWork 从入门到熟悉(1)---DbFirst
- Eclipse插件的几种安装方法
- linux基础之 gSOAP代码框架
- 浅谈 “矩”的概念
- 湖南省第六集程序设计竞赛 E-内部收益率(二分法)
- php语法
- 《ZooKeeper》 Chapter 3 Getting Started with the ZooKeeper API
- 收录BUG
- 查找算法
- 站立会议09(第一期)