UVa 571 Jugs(经典倒水问题)

题意:

有A, B两个容量的罐子,A B互质,可以对其执行一系列倒水操作,最终使B中剩下的水位n

思路:

1. 前提条件:如果A B互质,则 r = x*A mod B,对于x∈[0, B-1]  r≠0. 这个很容易用最小公倍数证明之。

2. 有了前提条件,则证明 r1 = x1*A mod B,  r2 = x2*A mod B,对于x1, x2∈[0, B-1],x1≠x2 有r1≠r2.

    下面用反证法来证明之:

    如果x1, x2∈[0, B-1],x1≠x2 有r1=r2,则存在 (x1-x2)*A mod B = 0.

    由1知,显然矛盾了。所以2成立。

3. 由2可得,当x取遍[0, B-1]的值的时候,r也一定取遍了[0, B-1]区间里面的值。

对于本题来说,我采取下面的一种策略:

每次A是空的就加水,不空就向B倒,B满了之后就empty掉,这样在B中一定可以形成0-B的任意一个解。

#include <cstdio>
#include <cstdlib>
#include <cstring>

int main()
{
    int ca, cb, n;
    while (scanf("%d %d %d", &ca, &cb, &n) != EOF)
    {
        int a = 0, b = 0;
        while (true)
        {
            if (b == n)
            {
                printf("success\n");
                break;
            }
            else if (b == cb)
            {
                printf("empty B\n");
                b = 0;
            }
            else if (a == 0)
            {
                printf("fill A\n");
                a = ca;
            }
            else if (a != 0)
            {
                printf("pour A B\n");
                if (a + b <= cb)
                    b += a, a = 0;
                else
                    a = a + b - cb, b = cb;
            }
        }
    }
    return 0;
}
posted @ 2012-12-05 13:36  kedebug  阅读(392)  评论(0编辑  收藏  举报