URAL_1051
这个题目基本算是YY出来的,具体也没有去证明。
由于N和M可能比较大,于是就想如何将其变成小一点矩阵去考虑,这时发现3*x(x>=2)的矩阵有一个特性,可以变成3*(x-1)的矩阵,利用这个特性,我们可以将N*M(N,M>=3)的矩阵变成3*3、3*4、3*5、4*4、4*5、5*5之中的一个(因为可以通过一定的手段让x*y的矩阵变成(x-3)*y的矩阵,有个前提就是y>=3,至于怎么搞还是留给大家做思考吧,就不多说了),这样只要考虑有限个矩阵的情况就可以得到最后的结果了(不过我没有证明变成这样会不会使结果更差)。
画一下就可以得到3*3、3*4、3*5最后只能变成2个,而4*4、4*5、5*5最后可以变成1个。
接下来还要讨论一下2*x和1*x的情况,对于2*x(x>=4)也可以得到一个特性,即可以变成2*(x-3)的矩阵。
#include<stdio.h> #include<string.h> void swap(int &x, int &y) { int t; t = x, x = y, y = t; } int main() { int x, y; while(scanf("%d%d", &x, &y) == 2) { if(x > y) swap(x, y); if(x == 1) printf("%d\n", y / 2 + (y % 2 ? 1 : 0)); else if(x == 2) { y %= 3; printf("%d\n", y ? 1 : 2); } else { x = x % 3 + 3, y = y % 3 + 3; if(x > y) swap(x, y); printf("%d\n", x == 3 ? 2 : 1); } } return 0; }