您的位置:首页 > 其它

UVa 571 Jugs(经典倒水问题)

2012-12-05 13:36 253 查看
题意:

有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: