第一次做三分法,昨天晚上被边界问题折么了好久,初学三分的话一定要好好想想这个边界问题。
题解:三分法,一共有两种装备,并且这两种装备的权值是一样的,这里叫做装备A和装备B,把r设为最多能做多少件装备A。
check函数为:已知装备A的件数,看看剩下的材料能做多少件装备B,返回能做件数的总数。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1010;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
int x,y;
int check(int n){
    return n+min((x-2*n)/4,y-3*n);
}
int main(){
    int t;
    cin>>t;
    while (t--){
        cin>>x>>y;
        int l=0,r=min(x/2,y/3);
        int ans=0;
        while (l<=r){
            int mid1=l+(r-l)/3;
            int mid2=r-(r-l)/3;
            if(l==r){
                ans=check(l);
                break;
            }
            if(check(mid1)>check(mid2)){
                ans=check(mid1);
                r=mid2-1;
            }
            else l=mid1+1;
            //cout<<l<<" "<<r<<endl;
        }
        cout<<ans<<endl;
    }
    return  0;
}