題意:
在電影《虎膽龍威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加侖。
ac**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
#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...