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的任意一个解。
有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; }
相关文章推荐
- UVA 571 Jugs(经典倒水问题)
- UVA - 571 - Jugs (数论 - 经典倒水问题)
- uva 571 - Jugs(倒水问题)
- UVa - 571 - Jugs -(倒水问题)
- UVa 10603 - Fill,经典倒水问题+隐式图搜索+dfs
- POJ1606 HDU1415 UVA571 UVALive5502 Jugs【倒水+模拟】
- USACO 1.4 Mother's Milk 母亲的牛奶(经典的dfs倒水问题)
- 例题7-8 UVA 10603 Fill 倒水问题
- uva 816 BFS求最短路的经典问题……
- UVA 10603 Fill(倒水问题)
- Fill (Uva 10603 bfs 倒水问题)
- UVA10603 Fill【倒水问题+优先搜索】
- UVa 10603 倒水问题
- 入门经典-p130-倒水问题代码解析
- 【算法竞赛入门经典】多阶段决策问题 例题9-5 UVa12563
- uva 662 (经典DP邮局问题)
- uva 116 Unidirectional TSP 单向TSP 问题,经典dP(路径输出注意规划方向)
- Uva 101 the block problem 木块问题(算法竞赛经典入门)STL vector
- Uva 倒水问题
- 倒水问题(Fill, UVa 10603)