【规律】【贪心】【数学】HDU 5573 Binary Tree

题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5573

题目大意

  从1走到第k层,下一层的数是上一层的数*2或者*2+1,可以选择加上或者减去走的数,最终要求结果为n

  输出每层走的数,和是加还是减

题目思路:

  【规律】【贪心】【数学】

  首先苦思冥想一下,发现,1 2 4 8...2k可以凑成任意的奇数。而偶数只需要把2k变为2k+1。

  (从k往1位考虑加减,把+看为1,-看为0,则1+2+4+...=2k-1,符号可以用二进制数X表示,为1111111...,每次X-1,则原式的答案-2)

  (如+1+2+4+8=24-1=15,X=1111,则当X=1110时,表示-1+2+4+8=13,X=1101时,表示+1-2+4+8=11,以此类推可以得到任意奇数,偶数同理)

  所以可以从2k往前推,当前值比n大就去-,小就取+。

 1 //
 2 //by coolxxx
 3 //
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<memory.h>
 9 #include<time.h>
10 #include<stdio.h>
11 #include<stdlib.h>
12 #include<string.h>
13 #include<stdbool.h>
14 #include<math.h>
15 #define min(a,b) ((a)<(b)?(a):(b))
16 #define max(a,b) ((a)>(b)?(a):(b))
17 #define abs(a) ((a)>0?(a):(-(a)))
18 #define lowbit(a) (a&(-a))
19 #define sqr(a) ((a)*(a))
20 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
21 #define eps 1e-8
22 #define J 10
23 #define MAX 0x7f7f7f7f
24 #define PI 3.1415926535897
25 #define N 77
26 using namespace std;
27 int cas,cass;
28 long long n,m,lll,ans;
29 long long e[N];
30 void print(int top,int x)
31 {
32     if(top==0)
33     {
34         if(x<n)puts("1 +");
35         else puts("1 -");
36         return;
37     }
38     if(x>n)
39     {
40         print(top-1,x-e[top]);
41         printf("%lld -\n",e[top]);
42     }
43     else
44     {
45         print(top-1,x+e[top]);
46         printf("%lld +\n",e[top]);
47     }
48 }
49 int main()
50 {
51     #ifndef ONLINE_JUDGE
52 //    freopen("1.txt","r",stdin);
53 //    freopen("2.txt","w",stdout);
54     #endif
55     int i,j,k;
56 //    while(~scanf("%s",s1))
57 //    while(~scanf("%d",&n))
58     for(e[0]=1,i=1;i<=61;i++)
59         e[i]=e[i-1]<<1;
60     for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
61     {
62         printf("Case #%d:\n",cass);
63         scanf("%lld%lld",&n,&m);
64         m--;
65         if(n&1)
66         {
67             print(m-1,e[m]);
68             printf("%lld +\n",e[m]);
69         }
70         else
71         {
72             print(m-1,e[m]+1);
73             printf("%lld +\n",e[m]+1);
74         }
75     }
76     return 0;
77 }
78
79 /*
80 //
81
82 //
83 */

千万不要点

时间: 2024-11-08 23:08:59

【规律】【贪心】【数学】HDU 5573 Binary Tree的相关文章

hdu 5573 Binary Tree 构造

Binary Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 774    Accepted Submission(s): 450Special Judge Problem Description The Old Frog King lives on the root of an infinite tree. According

HDU 5573 Binary Tree(找规律)

题目链接: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 <cs

hdu 1701 (Binary Tree Traversals)(二叉树前序中序推后序)

Binary Tree Traversals Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description A binary tree is a finite set of vertices that is either empty or consists of a root r and two disjoint binary trees called

hdu 1710 Binary Tree Traversals 前序遍历和中序推后序

题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4205    Accepted Submission(s): 1904 Problem Description A binary tree i

hdu 6161--Big binary tree(思维--压缩空间)

题目链接 Problem Description You are given a complete binary tree with n nodes. The root node is numbered 1, and node x's father node is ⌊x/2⌋. At the beginning, node x has a value of exactly x. We define the value of a path as the sum of all nodes it pa

HDU 1710 Binary Tree Traversals(二叉树)

题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; typedef struct node { int date ; node *lchild , *rchild ; }*tree; int getk(int ch,int ino[],int is,int n) { for(int i = is ; i <= is + n -1 ; i++) if(ino[

【二叉树】hdu 1710 Binary Tree Traversals

acm.hdu.edu.cn/showproblem.php?pid=1710 [题意] 给定一棵二叉树的前序遍历和中序遍历,输出后序遍历 [思路] 根据前序遍历和中序遍历递归建树,再后续遍历输出 malloc申请空间在堆,函数返回,内存不释放,需要free手动释放 [Accepted] #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<alg

HDU 1710 Binary Tree Traversals

题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历 首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树 前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗树的根节点, 然后拆分出左右子树,对左右子树进行相同的操作,也就是将建树的这个函数递归调用下去 build函数还是理解了好久啊话说= =仍然是学习的代码 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring>

HDU 4925 Apple Tree 找呀找规律

间隔着取_(:зゝ∠)_ #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; int n, m; int init(int i, int j) { int cnt = 1; if(i-1 >= 1) cnt *= 2; if(i+1 <= n) cnt *= 2; if(j-1 >= 1) cnt *=