HDU 5573 Binary Tree(找规律)

本文介绍了一道关于完全二叉树的编程题,题目要求寻找一条路径上的节点值,通过选择正负号使路径和等于给定值N。文章提供了具体的解题思路和实现代码。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5573

题意:给你一个完全二叉树,节点为自然数的排列(第一行1,第二行2 3,第三行4 5 6 7。。。)。现在,给你一个N和K,K表示给你这个完全二叉树的前K行,从第1行到第K行有很多路径,希望找到一条路径能表示N,路径上的节点可取正也可取负,要求最后的和为N。

思路:由题目给的数据范围可知前两个节点有一个一定可以表示N。(前两个节点可以表示1 - 2^k)

code:

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 const int MAXN = 65;
 5 typedef long long LL;
 6 
 7 struct node
 8 {
 9     LL value;
10     char ch;
11 };
12 node rec[MAXN];
13 void solve(LL p, LL N)
14 {
15     int L = 1;
16     while (true) {
17         if (N < 0) {
18             rec[L].value = p;
19             rec[L++].ch = '-';
20             N += p;
21             p >>= 1;
22         } 
23         else if (N > 0) {
24             rec[L].value = p;
25             rec[L++].ch = '+';
26             N -= p;
27             p >>= 1;
28         }
29         else return;
30     }
31 }
32 
33 int main() 
34 {
35     int T;
36     scanf("%d", &T);
37     for (int cas = 1; cas <= T; ++cas) {
38         LL N;
39         int K;
40         scanf("%lld %d", &N, &K);
41         LL p = (LL)pow(2L, K - 1) + 1;
42         if (N & 1) --p;
43         solve(p, N);
44         printf("Case #%d:\n", cas);
45         for (int i = K; i >= 1; --i) {
46             printf("%lld %c\n", rec[i].value, rec[i].ch);
47         }
48     }
49     return 0;
50 }

转载于:https://www.cnblogs.com/ykzou/p/5012195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值