您的位置:首页 > 其它

Jugs【ZOJ 1005题】--- 两水壶灌水趣题

2013-04-06 21:04 260 查看
题目链接: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!

所以,本题是个水题,最后得知是小学生趣味数学题一枚,只要一直按一个方向灌水,就可以得到要求的容量。

#include <stdio.h>

void operation(int ca, int canow, int cb, int cbnow, int n)//canow,cbnow分别代指A,B当前的水量
{
if(cbnow == n)
{
return;
}
else
{
if(cbnow > ca)//剩余水量比A总量还大
{
printf("pour B A\n");
if(cbnow - (ca - canow) == n)//害怕判题系统会认为底下一个printf多余,所以就加上了这个if语句
{
return;
}
printf("empty A\n");
operation(ca, 0, cb, cbnow - (ca - canow), n);
}
else//剩余水量小于A总量,把它转移到A中保存
{
printf("pour B A\n");
printf("fill B\n");
operation(ca, cbnow, cb, cb, n);
}
}
}

int main()
{
int ca, cb, n;
while(scanf("%d %d %d", &ca, &cb, &n) != EOF)
{
printf("fill B\n");
operation(ca, 0, cb, cb, n);
printf("success\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: