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;
}
posted on 2012-05-07 13:34  Staginner  阅读(277)  评论(0编辑  收藏  举报