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;
}
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------