加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Binary Tree HDU - 5573 (思维)

发布时间:2020-12-14 04:33:30 所属栏目:大数据 来源:网络整理
导读:题目链接: B - Binary Tree ? HDU - 5573? 题目大意: 给定一颗二叉树,根结点权值为1,左孩子权值是父节点的两倍,右孩子是两倍+1; 给定?n?和?k,让你找一条从根结点走到第k层的路径,每经过一个结点,必须加上或者减去其权值,最后得到的结果是n; 具体

题目链接:

B - Binary Tree

?HDU - 5573?

题目大意:

给定一颗二叉树,根结点权值为1,左孩子权值是父节点的两倍,右孩子是两倍+1;

给定?n?和?k,让你找一条从根结点走到第k层的路径,每经过一个结点,必须加上或者减去其权值,最后得到的结果是n;

具体思路:因为每个点都需要用到,所以我们先假设所有的点都需要用到,这个时候就全部是"+"号,然后通过二进制的性质,能够凑齐范围内的所有数,然后我们算一下差值还有多少,然后再减去这个差值就好了。

AC代码:

 1 #include<bits/stdc++.h>  2 using namespace std;  3 # define ll long long  4 # define inf 0x3f3f3f3f  5 const int maxn = 65;  6 ll a[maxn],sum[maxn];  7 ll ans[maxn];  8 int vis[maxn];  9 void init() 10 { 11 a[1]=1ll; 12 sum[1]=a[1]; 13 for(int i=2; i<=60; i++) 14  { 15 a[i]=a[i-1]*2ll; 16 sum[i]=sum[i-1]+a[i]; 17  } 18 } 19 int main() 20 { 21 int T,Case=0,tt; 22  init(); 23 scanf("%d",&T); 24 while(T--) 25  { 26  ll n,k; 27 scanf("%lld %lld",&n,&k); 28 printf("Case #%d:n",++Case); 29 ll tmp=sum[k]-n; 30 if(tmp&1) 31 tmp=(tmp+1)>>1,ans[k]=a[k]+1; 32 else 33 tmp>>=1,ans[k]=a[k]; 34 vis[k]=1; 35 for(int i=k-1; i>=1; i--) 36  { 37 ans[i]=a[i]; 38 if(tmp>=a[i]) 39  { 40 tmp-=a[i]; 41 vis[i]=0; 42  } 43 else 44 vis[i]=1; 45  } 46 for(int i=1; i<=k; i++) 47  { 48 printf("%lld %cn",ans[i],vis[i]==0? - : + ); 49  } 50  } 51 return 0; 52 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读