A. Shovels and Swords(数学,均分)

n < = m 现在假设n<=m

2 n < = m , 使 m , n 当2n<=m,就算一直使用两倍的m仍然有多,此时答案是n

2 n > m 当2n>m

: \color{Red}方法一:数学构造

m , n , m 那么我们可以先多用一些m,也就是每次消耗n一次,消耗m两次

n m , m n 消耗到n和m相等为止,也就是执行这种操作m-n次

n m 此时n和m一样多了

n , m n 1 , m 那么可以n消耗两次,m消耗一次。紧接着n消耗1次,m消耗两次

n / 3 2 也就是答案再加上n/3*2

n m 0 , 1 , 2 , 2 1 这个时候n和m余数可能是0,1,2,如果余数是2说明答案还可以加1

: \color{Red}方法二:结论

, ( n + m ) / 3 可以这么说,这种情况下答案一定是(n+m)/3

n m 3 因为经过上面的分析知道最后n和m一定可以用到都小于3

n + m 3 , n m 所以只要存在n+m还大于等于3,不管n多还是m多

2 1 n m 3 , 都可以消耗多的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;
		} 
	}
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106700986