UVA 571 Jugs(經典倒水問題)

2021-06-28 19:19:58 字數 1156 閱讀 9554

題意:

在電影《虎膽龍威3》中,布魯斯和傑克遜要面對這樣乙個問題,他們有乙個3加侖的杯子和乙個5加侖的杯子,他們被問這麼把5加侖的杯子裡面填滿4加侖的水。

這個問題可以被描述為這樣乙個謎題。

你擁有兩個杯子a和b,以及無盡的水。

你可以執行以下3種操作

1.填滿1個杯子的水

2.倒空1個杯子的水

3.將1個杯子的水倒到另外1個杯子。當倒到第乙個杯子為空或者第二個杯子為滿的時候停止。

現在給你乙個3元組(ca,cb,n),ca,cb分別是a和b的容量,特別地,n是要倒的目標。

有乙個解決方案是乙個連續的步驟使得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的任意乙個解。

ac**

#include 

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int inf = 0x3f3f3f3f;

int ca, cb , n;

int main() else

if(b == cb) else

if(a == 0) else }}

return

0;}

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,對...

UVA 10635 J 最長上公升子串行

題意 給你長度為a 1與b 1的兩個數列,數列的數各不相同,並且只包含1 n n的數,求a與b的最長公共子串行。題解 由於兩個串最多長度都為250 250所以n n的最長公共子串行的做法不適合,但是我們可考慮,乙個數列中,所有的數字各不相同,所以我們可以通過將a陣列標記1 a 1,然後將b陣列通過a...