题意:t个用例,用n个点构成二叉树,问第m层最多有几个点。 从第0层开始记。
例:
输入:
13 //t
11 0 //n m
11 1
11 2
11 3
11 4
11 5
11 6
11 7
11 8
11 9
11 10
11 11
11 12
输出:
1
2
4
5
4
4
4
3
2
2
1
0
0
二分答案。。。
根据第m层点的个数,能推出m-1层点的个数。。
m层t个点。。m-1层---t为偶数时,t/2个点
t为奇数时,t/2+1个点
每层点的个数加和sum,即为这个二叉树需要的点。
sum>n,说明t值 取大了,反之,t值取小了。。
二分。。
注意当计算sum值时,如果t值为1,则他上面层的值都为1,直接都计算了就好。。。不优化就TLE了。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int check(int a,int m)
{
int t=a,sum=a;
m--;
while(m>=0)
{
if(t==1)
{
sum+=(m+1);//优化
break;
}
if(t&1==1)
t=t/2+1;
else
t=t/2;
sum+=t;
m--;
}
if(t==1)
return sum;
else
return 0x3f3f3f3f;
}
int main()
{
int t;
int n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int l=0,r=1000000000;
if(m>=n)
{
printf("0\n");
continue;
}
while(l<r)
{
int mid=(r+l+1)/2;
int t=check(mid,m);
if(t<=n)
l=mid;
else
r=mid-1;
}
printf("%d\n",l);
}
}