UVA 571 Jugs
2011-12-11 21:58
281 查看
UVA_571
一开始没什么思路,后来看了别人的解题报告发现是用类似贪心的方式去做的。
由于这个题目没有限定倒水的次数,所以只要构造出一个可行解就可以,如果我们每次A是空的就加水,不空就向B倒,B满了之后就empty掉,这样在B中一定可以形成0-B的任意一个解。
后来自己简单的证明了一下。按这样去倒水的话,我们可以用(n*A)%B表示B中的水量,由于A与B互质,那么容易得到这个函数的最小周期是B,并且在一个周期内,我们易证明这个函数的值均是不同的,而一个周期内(准确来说要包含两个临界点)n的取值是0-B,那么对应的值也必然会恰好覆盖满0-B,因此这样我们就一定可以得到一个满足要求的操作序列。
一开始没什么思路,后来看了别人的解题报告发现是用类似贪心的方式去做的。
由于这个题目没有限定倒水的次数,所以只要构造出一个可行解就可以,如果我们每次A是空的就加水,不空就向B倒,B满了之后就empty掉,这样在B中一定可以形成0-B的任意一个解。
后来自己简单的证明了一下。按这样去倒水的话,我们可以用(n*A)%B表示B中的水量,由于A与B互质,那么容易得到这个函数的最小周期是B,并且在一个周期内,我们易证明这个函数的值均是不同的,而一个周期内(准确来说要包含两个临界点)n的取值是0-B,那么对应的值也必然会恰好覆盖满0-B,因此这样我们就一定可以得到一个满足要求的操作序列。
#include<stdio.h> #include<string.h> int Ca, Cb, N; void solve() { int i, j, k, a, b; a = b = 0; for(;;) { if(b == N) { printf("success\n"); break; } else if(b == Cb) { printf("empty B\n"); b = 0; } if(!a) { printf("fill A\n"); a = Ca; } printf("pour A B\n"); if(a + b > Cb) { a = a + b - Cb; b = Cb; } else { b += a; a = 0; } } } int main() { while(scanf("%d%d%d", &Ca, &Cb, &N) == 3) { solve(); } return 0; }
相关文章推荐
- UVA - 571 - Jugs (数论 - 经典倒水问题)
- uva 571 Jugs
- UVa 571 - Jugs (数论)
- uva 571 - Jugs(倒水问题)
- UVA - 571 Jugs
- poj 1606 Jugs and poj 3414 Pots(数组模拟BFS) uva 571 (数论)
- UVa 571 - Jugs
- UVa:571 Jugs
- UVa 571 Jugs(经典倒水问题)
- UVa 571 Jugs (想法题)
- ZOJ 1005 - Jugs | UVA 571 - Jugs
- UVa - 571 - Jugs -(倒水问题)
- POJ1606 HDU1415 UVA571 UVALive5502 Jugs【倒水+模拟】
- Jugs uva571
- UVA571 - Jugs(数论)
- uva 571 Jugs
- uva 571 jugs
- UVA571 - Jugs(数论)
- Jugs - UVa 571 bfs
- UVA 571 Jugs ADD18 小白书10 数学Part1 专题