一开始考虑分类讨论,但是发现考虑的逻辑范围有点多,就很烦躁了。

其实此题如果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;
}