

一开始考虑分类讨论,但是发现考虑的逻辑范围有点多,就很烦躁了。
其实此题如果n%3==0或者m%3==0,都可以直接求出答案,那么实际上要考虑的其实只有n%3!=0&&m%3!=0的情况。
对于这种情况,没必要分四种情况讨论。其实对于任意一个情况,在处理掉可以被整除的部分后,剩余的部分其实只需要看一个数字。
比如m,m如果余1和2其实是不同的情况,那么分的具体情况其实不同。
但是要考虑到一个问题:都是要尽量凑"3"。那么,最终只能靠到1*2和1*1处理这些特殊问题。
那么只要考虑这些最后的特殊情况,并进行有效合并即可。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
if(n>m) swap(n,m);
int ans=0;
if(n%3==0)
{
cout<<(n/3)*m<<endl;
continue;
}
else if(m%3==0)
{
cout<<(m/3)*n<<endl;
continue;
}
else
{
ans+=m/3*n;
m%=3;
if(m==2)
{
ans+=n/3*m;
n%=3;
if(n==1)
{
ans++;
}
else
{
ans+=2;
}
}
else
{
ans+=n/3;
n%=3;
if(n) ans++;//这里余1时相当于除2,不切了
}
}
cout<<ans<<endl;
}
return 0;
}