题目传送门:Codeforces
制作一个铁锹需要两根木棍和一颗钻石,制作一把剑需要两颗钻石和一根木棍。每一个铁锹或剑都可以换一个祖母绿宝石,现在给a个木棍和b个宝石,问最多可以得到多少个宝石。
这道题虽然需要确定的因素比较多,但只要确定了其中一个因素,剩下的因素就确定了。比如,确定用x个木棍来制作剑,在满足条件的情况下,需要2x个钻石,剩下的材料都用来制作铁锹。
所以,我们只需要得到获得最多宝石时所对应的x,就可以得到答案。获得宝石的多少是由a和b中较小的一个决定,a=5,b=7与a=7,b=5所得到的答案是一样的。在求解x过程中,我们尽可能x的值更大,我们对x值进行二分求最大。x最小为0,最大是 min(a,b), 当确定x个木棍的某个状态后,只要所对应钻石的使用有富余,就可以使用更多的x,反之,更少的x,在这个过程中确定获得宝石的最大值,一定把 min(a,b) 用完。
#include
using namespace std;
const int Max=1e6+7;
#define ll long long
int a,b;
int main() {
int T; scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
int ans=0;
if(a>b) swap(a,b);
int l=1,r=a;
while(l<=r){
int mid=(l+r)/2;
// mid个木棍来制作剑
int t=(a-mid)/2+mid*2; // 剑和铁锹需要t颗钻石
if(t<=b) {
ans=max( ans, (a+mid)/2 );
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans<<endl;
}
return 0;
}