现在假设n<=m
当2n<=m,就算一直使用两倍的m仍然有多,此时答案是n
当2n>m
方法一:数学构造
那么我们可以先多用一些m,也就是每次消耗n一次,消耗m两次
消耗到n和m相等为止,也就是执行这种操作m−n次
此时n和m一样多了
那么可以n消耗两次,m消耗一次。紧接着n消耗1次,m消耗两次
也就是答案再加上n/3∗2
这个时候n和m余数可能是0,1,2,如果余数是2说明答案还可以加1
方法二:结论
可以这么说,这种情况下答案一定是(n+m)/3
因为经过上面的分析知道最后n和m一定可以用到都小于3
所以只要存在n+m还大于等于3,不管n多还是m多
都可以消耗多的2次少的1次把n和m都变成小于3的情况,对答案都有贡献
#include <bits/stdc++.h>
using namespace std;
int t,n,m;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
if(n>m) swap(n,m);
if(n*2<=m) cout<<n<<endl;
else
{
int cha=m-n,ans=0;
m-=2*cha,n-=cha,ans+=cha;
ans+=n/3*2;
n%=3,m%=3;
if(n==2) ans++;
cout<<ans<<endl;
//或者直接使用结论cout<<(n+m)/3<<endl;
}
}
}