题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=94468#problem/E
题意:n的意思是一共有2的n次方重量的金子,要使恰好a+b=重量,每次只能把金子炸开一半。
思路:只需要找到a和b中 最小的 2的次方 因子。
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int T,k1,k2;
long long n,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&n,&a,&b);//注意 long long
int k=min(a,b);
if(k==1)
{
printf("%d\n",n);
}
else
{
long long ans=1;
for(int i=1; i<=n; i++)
{
ans*=2;
}
long long a1=ans;
for(int i=n; i>=0; i--)
{
if(a>=ans)
{
a-=ans;
}
if(a==0)
{
k1=i;
break;
}
ans/=2;
}
for(int i=n; i>=0; i--)//一定到0,因为有可能会出现1
{
if(b>=a1)
{
b-=a1;
}
if(b==0)
{
k2=i;
break;
}
a1/=2;
}
if(k1>k2)//看a,b哪个里面的因子最小,输出次方数
{
printf("%d\n",n-k2);
}
else
{
printf("%d\n",n-k1);
}
}
}
return 0;
}