一开始考虑分类讨论,但是发现考虑的逻辑范围有点多,就很烦躁了。
其实此题如果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; }