题目链接: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); } 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-k2); } else { printf("%d ",n-k1); } } } return 0; }