题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1005
题目刚开始引用了《虎胆龙威3》,看到电影的英文单词时,不觉虎躯一震,顿时来了兴趣,其实细数一下,虎胆龙威系列,本人觉得3是最不好看的一部,因为这部跨街区追逐战早前在另一部好莱坞电影里面看过,所谓先入为主,时间久远,也没再深入查询是A抄袭了B还是B抄袭了A,甚至我连B的电影名字都忘记了,毕竟没有大腕儿在里面,度娘也帮不上忙。
当然,没看过电影并不影响做这道题,就像没看过《Monty Python》并不影响你成为python高手一样。
两个容量分别为ca和cb的水壶,cb>=ca,无限量的水,要求用这两个水壶之间的互相灌水或清空或装满,使B水壶最终盛放的水容量为N。
乍一看样例,吓到了,两个样例的倒水方向截然相反,我以为这就是一个突破口,于是各种演算,想找出倒水的方向原则,最后晕掉了,得到的都是自相矛盾的结果,无奈,我随便写了一个样例:5,18,2。然后就有一笔没一笔的在纸上划着:如果大灌小,可以得到13,8,3,16,11,6,1,14,9,4,17,12,7,2,15,10,5.竟然,发现所有的数据都可以由大灌小得到,我又重新做了样例2,success!
所以,本题是个水题,最后得知是小学生趣味数学题一枚,只要一直按一个方向灌水,就可以得到要求的容量。
1 #include <stdio.h> 2 3 void operation(int ca, int canow, int cb, int cbnow, int n)//canow,cbnow分别代指A,B当前的水量 4 { 5 if(cbnow == n) 6 { 7 return; 8 } 9 else 10 { 11 if(cbnow > ca)//剩余水量比A总量还大 12 { 13 printf("pour B A\n"); 14 if(cbnow - (ca - canow) == n)//害怕判题系统会认为底下一个printf多余,所以就加上了这个if语句 15 { 16 return; 17 } 18 printf("empty A\n"); 19 operation(ca, 0, cb, cbnow - (ca - canow), n); 20 } 21 else//剩余水量小于A总量,把它转移到A中保存 22 { 23 printf("pour B A\n"); 24 printf("fill B\n"); 25 operation(ca, cbnow, cb, cb, n); 26 } 27 } 28 } 29 30 int main() 31 { 32 int ca, cb, n; 33 while(scanf("%d %d %d", &ca, &cb, &n) != EOF) 34 { 35 printf("fill B\n"); 36 operation(ca, 0, cb, cb, n); 37 printf("success\n"); 38 } 39 return 0; 40 }