题目描述
牛牛有x件材料a和y件材料b,用2件材料a和3件材料b可以合成一件装备,用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量,于是牛牛找来了你帮忙。
输入描述:
输入包含t组数据
第一行一个整数t
接下来t行每行两个整数x,y
输出描述:
每组数据输出一行一个整数表示答案。
示例1
输入
5
4 8
7 6
8 10
100 4555
45465 24124
输出
2
2
3
50
13917
题解:这题如果暴力枚举的话是会TLE,打一下表发现极大值具有单调性,考虑三分搜索,
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+100;
int a,b,t;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>a>>b;
int l=0,r=min(a/2,b/3),mid,midmid;
while(r-l>10)
{
mid=(l+r)/2;midmid=(mid+r)/2;
int x1=mid+min((a-2*mid)/4,(b-3*mid));
int x2=midmid+min((a-2*midmid)/4,(b-3*midmid));
if(x1>x2)r=midmid;
else l=mid;
}
int res=0;
for(int i=l;i<=r;i++)
res=max(res,i+min((a-2*i)/4,(b-3*i)));
cout<<res<<endl;
}
}