POJ 1606 && HDU 1415 Jugs(机智)
来源:互联网 发布:java聊天室的代码 编辑:程序博客网 时间:2024/05/18 00:17
Description
给你两个容器,求出获得指定量水的步骤
三个操作
fiil A;将A容器装满水
empty A;将A容器中的水倒出
pour A B:将A容器中的水全部倒入B容器中
Input
多组输入,每组用例包括三个整数a,b,c分别表示两个容器的容量和目标容量,以文件尾结束输入(a,b互素)
Output
对于每组用例,输出获得C体积水的步骤,如果不存在可行解则输出impossible
Sample Input
3 5 4
5 7 3
Sample Output
fill B
pour B A
empty A
pour B A
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
empty B
pour A B
success
Solution
经典倒水问题,由ax+by=gcd(x,y)知对A,B两个水桶进行一系列灌水倒水操作后一定可以得到gcd(a,b)的水量,此处因为a,b互素,所以一定可以经过一系列操作得到一单位的水,那么得到c单位的水只需要重复操作即可。对于具体操作,每次只需灌满小桶,然后用小桶往大桶倒水,大桶满了就倒掉,当两个桶中有一个桶的水量达到目标水量时退出循环即可
Code
#include<stdio.h>int main(){ int a,b,c,x,y; while(~scanf("%d%d%d",&a,&b,&c)) { if(b==c)//B桶容量即为目标水量,灌满B桶即可 { printf("fill B\n"); } else if(a==c)//A桶容量为目标水量,因为要在B桶达到目标水量所以先灌满A桶然后将A桶中的水倒入B桶 { printf("fill A\n"); printf("pour A B\n"); } else { x=y=0; if(a<c)//当A桶容量小于目标容量时采取灌B桶倒A桶策略 { while(1) { if(y==0) { y=b; printf("fill B\n"); } if(y>a-x)//B桶水量大于当前A桶容纳量则将A桶倒满 { y-=a-x; x=a; printf("pour B A\n"); } else//B桶水量小于当前A桶容纳量则将B桶水全部倒入A桶 { x+=y; y=0; printf("pour B A\n"); } if(y==c)//B桶水量达到目标水量则退出循环 { break; } if(a==x)//A桶已满则清空A桶 { x=0; printf("empty A\n"); } } } else//当A桶容量小于目标容量时采取灌A桶倒B桶策略 { while(1) { if(x==0) { x=a; printf("fill A\n"); } if(x>b-y)//A桶水量大于当前B桶容纳量则将A桶倒满 { x-=b-y; y=b; printf("pour A B\n"); } else//A桶水量小于当前B桶容纳量则将A桶水全部倒入B桶 { y+=x; x=0; printf("pour A B\n"); } if(y==c)//B桶水量达到目标水量则退出循环 { break; } if(y==b)//B桶已满则清空B桶 { y=0; printf("empty B\n"); } } } } printf("success\n"); } return 0;}
0 0
- POJ 1606 && HDU 1415 Jugs(机智)
- poj 1606 || hdu 1415 Jugs
- hdu 1415 Jugs(BFS)
- poj 1606 Jugs
- poj 1606 Jugs (BFS)
- POJ 1606 Jugs
- poj 1606 Jugs
- POJ 1606 Jugs
- poj 1606 Jugs
- POJ-1606 Jugs
- hdu 1415 Jugs
- hdu1415和poj 1415 Jugs
- POJ 1606 Jugs 倒水问题
- poj 1606 Jugs(广搜BFS+路径输出)
- POJ 1852 Ants(机智)
- HDU 5301 Buildings(机智)
- HDU 6048 Puzzle(机智)
- ZOJ 1005 POJ 1606 Jugs /数论
- SQL 某月份用该月份的前三位英文表示
- 《TCP/IP入门经典》——网络访问层
- Servlet内部跳转
- NSNotificationCenter和消息推送的学习
- Bootloader
- POJ 1606 && HDU 1415 Jugs(机智)
- leetcode - Divide Two Integers
- 各种集合遍历
- 这题实在不知道起啥名好了
- 两个乒乓球队进行比赛,各出3人。
- HDU 5273 Dylans loves sequence
- 检查网线的插拔
- java,数据类型
- 空间组网相关文章更新(google scholar推送)