非常可乐(杭州电子科技大学第四届大学生程序设计竞赛)(九度2013年教程87题)
来源:互联网 发布:w7upnp nat端口失败 编辑:程序博客网 时间:2024/04/29 12:04
- 题目描述:
- 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升(正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
- 输入:
- 三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
- 输出:
- 如果能平分的话请输出最少要倒的次数,否则输出"NO"。
- 样例输入:
- 7 4 3
- 4 1 3
- 0 0 0
- 样例输出:
- NO
- 3
- 提示:可参考教程.附下载地址
http://120.192.83.81/2/file.data.vdisk.me/49948774/f0c8e4bdf58b1a80a08cbc6d675580df763b1c55?ip=1361548192,111.15.172.124&ssig=T8hG%2BSRbkr&Expires=1361546992&KID=sae,l30zoo1wmz&fn=%E3%80%8A2013%E5%B9%B4%E7%8E%8B%E9%81%93%E8%AE%BA%E5%9D%9B%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%80%83%E7%A0%94%E6%9C%BA%E8%AF%95%E6%8C%87%E5%8D%97%E3%80%8B_20130112.pdf
#include <cstdio> #include <queue> using namespace std; bool mar[101][101][101]; int S, N, M; struct Sta { int a, b, c, t; void init(int x, int y, int z, int cost) { a = x; b = y; c = z; t = cost; } void mark() { mar[a][b][c] = true; } }; Sta tt, st; queue<Sta> Q; bool AtoB(int a, int &sa, int b, int &sb) { if (b - sb >= sa) { sb += sa; sa = 0; } else { sa -= b - sb; sb = b; } if ((tt.a == S / 2 && tt.b == S / 2) || (tt.a == S / 2 && tt.c == S / 2) || (tt.b == S / 2 && tt.c == S / 2)) return true; else { if (!mar[tt.a][tt.b][tt.c]) { tt.t++; tt.mark(); Q.push(tt); } } return false; } int bfs() { while (!Q.empty()) { st = Q.front(); Q.pop(); tt = st; if (AtoB(S, tt.a, N, tt.b)) return tt.t + 1; tt = st; if (AtoB(S, tt.a, M, tt.c)) return tt.t + 1; tt = st; if (AtoB(N, tt.b, S, tt.a)) return tt.t + 1; tt = st; if (AtoB(N, tt.b, M, tt.c)) return tt.t + 1; tt = st; if (AtoB(M, tt.c, S, tt.a)) return tt.t + 1; tt = st; if (AtoB(M, tt.c, N, tt.b)) return tt.t + 1; } return -1; } int main() { while (~scanf("%d%d%d", &S, &N, &M) && !(S == 0 && N == 0 && M == 0)) { if (S % 2 == 1) { printf("NO\n"); continue; } for (int i = 0; i <= S; i++) for (int j = 0; j <= S; j++) for (int k = 0; k <= S; k++) mar[i][j][k] = false; while (!Q.empty()) Q.pop(); tt.init(S, 0, 0, 0); tt.mark(); Q.push(tt); int time = bfs(); if (time == -1) printf("NO\n"); else printf("%d\n", time); } return 0; }
- 非常可乐(杭州电子科技大学第四届大学生程序设计竞赛)(九度2013年教程87题)
- 2013年山东省第四届ACM大学生程序设计竞赛
- 第四届(2013年十月)福建省大学生程序设计竞赛
- 杭州电子科技大学程序设计竞赛(2016’12)
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
- 第四届福建省大学生程序设计竞赛
- 第四届 山东省ACM大学生程序设计竞赛
- 杭州电子科技大学程序设计竞赛(2016’12)- 网络同步赛
- 2013年山东省第四届ACM大学生程序设计竞赛——A^X mod P
- 2013年山东省第四届ACM大学生程序设计竞赛——Rescue The Princess
- 2013年山东省第四届ACM大学生程序设计竞赛——Contest Print Server
- 2013年山东省第四届ACM大学生程序设计竞赛——Mountain Subsequences
- 2013年山东省第四届ACM大学生程序设计竞赛-Alice and Bob (找规律+二进制)
- Contest Print Server (2013年山东省第四届ACM大学生程序设计竞赛):
- 2013年山东省第四届ACM大学生程序设计竞赛:Rescue The Princess
- 2013年山东省第四届ACM大学生程序设计竞赛 A^X mod P
- 九度OJ 教程87 广度优先搜索之《非常可乐》
- 湖南师范大学第四届大学生计算机程序设计竞赛练习
- hibernate执行mysql存储过程报异常could not execute native bulk manipulation query
- Android开发-监听系统的 home键
- 黑马程序员-学习日记13(IO流 2 )
- Qt HTML CSS颜色对照表
- Lucene-4.0.0的demo编译、发布和使用
- 非常可乐(杭州电子科技大学第四届大学生程序设计竞赛)(九度2013年教程87题)
- 学习SSH2 札记(不断更新中~~~)
- Android ViewPager多页面滑动切换以及动画效果
- 1048. Find Coins
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
- To Fill or Not to Fill<2011浙大复试机试>
- hbase的replication使用
- jquery的each()详细介绍
- stl容器在循环遍历中删除元素的方式