HDU 5573 Binary Tree 构造
Binary Tree
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5573
Description
The Old Frog King lives on the root of an infinite tree. According to the law, each node should connect to exactly two nodes on the next level, forming a full binary tree.
Since the king is professional in math, he sets a number to each node. Specifically, the root of the tree, where the King lives, is 1. Say froot=1.
And for each node u, labels as fu, the left child is fu×2 and right child is fu×2+1. The king looks at his tree kingdom, and feels satisfied.
Time flies, and the frog king gets sick. According to the old dark magic, there is a way for the king to live for another N years, only if he could collect exactly N soul gems.
Initially the king has zero soul gems, and he is now at the root. He will walk down, choosing left or right child to continue. Each time at node x, the number at the node is fx (remember froot=1), he can choose to increase his number of soul gem by fx, or decrease it by fx.
He will walk from the root, visit exactly K nodes (including the root), and do the increasement or decreasement as told. If at last the number is N, then he will succeed.
Noting as the soul gem is some kind of magic, the number of soul gems the king has could be negative.
Given N, K, help the King find a way to collect exactly N soul gems by visiting exactly K nodes.
Input
First line contains an integer T, which indicates the number of test cases.
Every test case contains two integers N and K, which indicates soul gems the frog king want to collect and number of nodes he can visit.
⋅ 1≤T≤100.
⋅ 1≤N≤109.
⋅ N≤2K≤260.
Output
For every test case, you should output "Case #x:" first, where x indicates the case number and counts from 1.
Then K lines follows, each line is formated as 'a b', where a is node label of the node the frog visited, and b is either '+' or '-' which means he increases / decreases his number by a.
It's guaranteed that there are at least one solution and if there are more than one solutions, you can output any of them.
Sample Input
2
5 3
10 4
Sample Output
Case #1:
1 +
3 -
7 +
Case #2:
1 +
3 +
6 -
12 +
Hint
题意
有一颗完全二叉树,第一个节点是1,他的左儿子就是i x 2,右儿子是i x 2+1
然后让你找到一个路径,使得通过加减恰好向下走k步之后,权值和为n
题解:
构造题
首先我们可以分析得到,所有答案都可以通过走 1,2,4,8,16.....来得到
为什么?因为n<=2^k.
如果是奇数,那么我们最后一步就选左儿子,否则选择右儿子
路径问题解决了,我们就差符号问题了
符号问题,我们就可以通过找规律来解决
比如 n的二进制为100101
那么我们k步的符号就可以是110010(1表示+,0表示-)
就第一个位置是1,其他位置都是0就好了
比如001,你可以通过4-2-1来构造出来,就是001->100
讲得比较玄乎,大家意会吧 T T
代码
#include<bits/stdc++.h>
using namespace std;
long long n,k;
int flag = 0;
int a[100];
int main()
{
int t;scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
scanf("%lld%lld",&n,&k);
flag = 0;
memset(a,0,sizeof(a));
if(n%2==0)
{
flag = 1;
n = n-1;
}
int tmp = 0;
for(int i=k-1;i>=0;i--)
{
a[i]=1-tmp;
tmp=1;
if((n>>i)&1)
tmp=0;
}
printf("Case #%d:\n",cas);
long long now = 1;
for(int i=0;i<k-1;i++)
{
printf("%lld ",now);
now = now*2;
if(a[i])printf("+\n");
else printf("-\n");
}
if(flag)printf("%lld ",now+1);
else printf("%lld ",now);
if(a[k-1])printf("+\n");
else printf("-\n");
}
}
HDU 5573 Binary Tree 构造的更多相关文章
- HDU 5573 Binary Tree【构造】
几天前模拟区域赛的一道题,今天发现在草稿箱里直接补个博客. 感觉这还是一道很有意思的构造题. 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 ...
- HDU 5573 Binary Tree(构造题)
http://acm.hdu.edu.cn/showproblem.php?pid=5573 题意:给出一个满二叉树,根节点权值为1,左儿子为2*val,右儿子为2*val+1.现在有只青蛙从根节点出 ...
- 【规律】【贪心】【数学】HDU 5573 Binary Tree
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 题目大意: 从1走到第k层,下一层的数是上一层的数*2或者*2+1,可以选择加上或者减去走的数 ...
- HDU 5573 Binary Tree(找规律)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5573 题意:给你一个完全二叉树,节点为自然数的排列(第一行1,第二行2 3,第三行4 5 6 7... ...
- HDU 1710 Binary Tree Traversals (二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 1710 Binary Tree Traversals(树的建立,前序中序后序)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu 1710 Binary Tree Traversals 前序遍历和中序推后序
题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (J ...
- HDU 1710 Binary Tree Traversals(二叉树遍历)
传送门 Description A binary tree is a finite set of vertices that is either empty or consists of a root ...
- hdu 6161--Big binary tree(思维--压缩空间)
题目链接 Problem Description You are given a complete binary tree with n nodes. The root node is numbere ...
随机推荐
- 使用命令行设置svn忽略列表
Windows 上的 TortoiseSVN 设置 svn 的忽略列表是非常方便的,但是在Mac OS X上,好用的图形化 svn 客户端都有点儿贵,比如 Versions 和 CornerStone ...
- 第一个UI脚本--python+selenium
之前一直是用java+selenium做自动化测试的,最近因为工作需要,需要用pyhton+selenium去实现,于是就赶驴上架,熟悉了一下python的语法和脚本的编写过程,下面是一个简单的脚本, ...
- LoadRunner界面分析(二)
1.Controller 2.创建运行场景 3.方案设计 4.Resuls settting 5.监视方案
- 骑士周游问题 --- 递归解法 --- java代码
骑士游历: 定义了向量的数组M,行数组X,列数组Y, 棋盘plane,计数器count,走动步数step 需要注意的是,递归函数的进入前的验证,原先的想法是传入来时的方向参数,可是这样的想法被实践否定 ...
- 有趣的库:pipe(类似linux | 管道)库
pipe并不是Python内置的库,如果你安装了easy_install,直接可以安装它,否则你需要自己下载它:http://pypi.python.org/pypi/pipe 之所以要介绍这个库,是 ...
- Hadoop学习笔记1---简介 优点 架构分析
一.Hadoop简介 Hadoop最早起源于Nutch.Nutch是一个开源的网络搜索引擎,由Doug Cutting于2002年创建.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取. ...
- 使用sem_post信号量进行线程同步
写了一小段程序,测试一下线程同步的问题,如下: #include <stdio.h> #include <string.h> #include <semaphore.h& ...
- chrome浏览器插件window resizer调试webapp页面大小
chrome浏览器插件window resizer可以调整当前浏览器分辨率大小 可以自定义大小,以适合于andorid和iphone设备
- McAfee Host Intrusion Prevention
McAfee Host Intrusion Prevention是一款集防火墙功能和HIPS于一身的主动防御和防火墙软件,将其与 McAfee VirusScan Enterprise 8.5/8.7 ...
- Bluetooth in Android 4.2 and 4.3(一):综述
从Android 4.2开始,Bluetooth stack发生了重大改变:从Bluez换成了由Google和Broadcom联合开发的Bluedroid(当然,核心的部分还是Broadcom的,Go ...