非常可乐

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 22067 Accepted Submission(s): 8968

Problem Description

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

Input

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

Output

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

Sample Input

7 4 3

4 1 3

0 0 0

Sample Output

NO

3

【题意】:给三个数字 s n m s=n+m s在1到100之间

就是个倒水问题,可以互相倒来倒去,一共有六种倒法,现在要求最少经过多少步就能平分那么多水 。

【分析】:之前因为min的顺序没写到最前面导致ed没有初始化,以及120行有个笔误把st写成ed

【代码】:

  1. #include<cstdio>
  2. #include<string>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<cstring>
  7. #include<set>
  8. #include<queue>
  9. #include<algorithm>
  10. #include<vector>
  11. #include<map>
  12. #include<cctype>
  13. #include<stack>
  14. #include<sstream>
  15. #include<list>
  16. #include<assert.h>
  17. #include<bitset>
  18. #include<numeric>
  19. #define debug() puts("++++")
  20. #define gcd(a,b) __gcd(a,b)
  21. #define lson l,m,rt<<1
  22. #define rson m+1,r,rt<<1|1
  23. #define fi first
  24. #define se second
  25. #define pb push_back
  26. #define sqr(x) ((x)*(x))
  27. #define ms(a,b) memset(a,b,sizeof(a))
  28. #define sz size()
  29. #define be begin()
  30. #define pu push_up
  31. #define pd push_down
  32. #define cl clear()
  33. #define lowbit(x) -x&x
  34. #define all 1,n,1
  35. #define rep(i,x,n) for(int i=(x); i<(n); i++)
  36. #define in freopen("in.in","r",stdin)
  37. #define out freopen("out.out","w",stdout)
  38. using namespace std;
  39. typedef long long LL;
  40. typedef unsigned long long ULL;
  41. typedef pair<int,int> P;
  42. const int INF = 0x3f3f3f3f;
  43. const LL LNF = 1e18;
  44. const int maxn = 500; //数组之前开小了...但是一直显示TLE而不是RE???我爆哭
  45. const int maxm = 1e6 + 10;
  46. const double PI = acos(-1.0);
  47. const double eps = 1e-8;
  48. const int dx[] = {-1,1,0,0};
  49. const int dy[] = {0,0,1,-1};
  50. int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
  51. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  52. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  53. int a,b,c;
  54. int v[105][105][105];
  55. struct node
  56. {
  57. int x,y,z,step;
  58. }st,ed;
  59. int check(int x,int y,int z)
  60. {
  61. return (x==a/2 && y==a/2) || (x==a/2 && z==a/2) || (y==a/2 && z==a/2);
  62. }
  63. queue<node> q;
  64. void bfs()
  65. {
  66. ms(v,0);
  67. while(!q.empty()) q.pop();
  68. //初始化三个杯子:可乐杯满的;b、c杯空的
  69. st.x = a;//可乐杯子满的
  70. st.y = 0;//b杯子空
  71. st.z = 0;//c杯子空
  72. st.step = 0;
  73. v[a][0][0] = 1; //标记杯子状态
  74. q.push(st);
  75. while(!q.empty())
  76. {
  77. st = q.front();
  78. q.pop();
  79. if(check(st.x,st.y,st.z)) //满足条件直接输出
  80. {
  81. printf("%d\n",st.step);
  82. return ;
  83. }
  84. //a——>b
  85. if(st.x>0 && st.y<b)
  86. {
  87. //两种情况,一种是把A里的水全倒到B还没有把B倒满
  88. //另一种是,A里的水还没倒完B就满了,所以取两者最小值
  89. ed.y = min(b,st.x+st.y);
  90. ed.x = st.x - (ed.y-st.y);
  91. ed.z = st.z;
  92. ed.step = st.step + 1;
  93. if(!v[ed.x][ed.y][ed.z])
  94. {
  95. v[ed.x][ed.y][ed.z]=1;
  96. q.push(ed);
  97. }
  98. }
  99. //a——>c
  100. if(st.x>0 && st.z<c)
  101. {
  102. ed.z = min(c,st.x+st.z);
  103. ed.x = st.x - (ed.z-st.z);
  104. ed.y = st.y;
  105. ed.step = st.step + 1;
  106. if(!v[ed.x][ed.y][ed.z])
  107. {
  108. v[ed.x][ed.y][ed.z]=1;
  109. q.push(ed);
  110. }
  111. }
  112. //b——>a
  113. if(st.y>0 && st.x<a)
  114. {
  115. ed.x = min(a,st.x+st.y);
  116. ed.y = st.y - (ed.x-st.x);
  117. ed.z = st.z;
  118. ed.step = st.step + 1;
  119. if(!v[ed.x][ed.y][ed.z])
  120. {
  121. v[ed.x][ed.y][ed.z]=1;
  122. q.push(ed);
  123. }
  124. }
  125. //b——>c
  126. if(st.y>0 && st.z<c)
  127. {
  128. ed.z = min(c,st.y+st.z);
  129. ed.x = st.x;
  130. ed.y = st.y - (ed.z-st.z);
  131. ed.step = st.step + 1;
  132. if(!v[ed.x][ed.y][ed.z])
  133. {
  134. v[ed.x][ed.y][ed.z]=1;
  135. q.push(ed);
  136. }
  137. }
  138. //c——>a
  139. if(st.z>0 && st.x<a)
  140. {
  141. ed.x = min(a,st.x+st.z);
  142. ed.y = st.y;
  143. ed.z = st.z - (ed.x-st.x);
  144. ed.step = st.step + 1;
  145. if(!v[ed.x][ed.y][ed.z])
  146. {
  147. v[ed.x][ed.y][ed.z]=1;
  148. q.push(ed);
  149. }
  150. }
  151. //c——>b
  152. if(st.z>0 && st.y<b)
  153. {
  154. ed.y = min(b,st.y+st.z);
  155. ed.x = st.x;
  156. ed.z = st.z - (ed.y-st.y);
  157. ed.step = st.step + 1;
  158. if(!v[ed.x][ed.y][ed.z])
  159. {
  160. v[ed.x][ed.y][ed.z]=1;
  161. q.push(ed);
  162. }
  163. }
  164. }
  165. printf("NO\n");
  166. }
  167. int main()
  168. {
  169. while(~scanf("%d%d%d",&a,&b,&c),a+b+c)
  170. {
  171. while(!q.empty()) q.pop();
  172. if(a&1) {puts("NO"); continue;}
  173. bfs();
  174. }
  175. }
  176. /*
  177. 7 4 3
  178. 4 1 3
  179. 0 0 0
  180. Sample Output
  181. NO
  182. 3
  183. */

【可以使用数组装x y z,把倒水逻辑封装起来,就不要写6次只要写1次】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ms(a,b) memset(a,b,sizeof(a))
  4. int v[105][105][105];
  5. int c[5];
  6. struct node
  7. {
  8. int c[5];
  9. int s;
  10. }tmp,temp;
  11. void pour(int a,int b)
  12. {
  13. int sum = temp.c[a] + temp.c[b];
  14. if(sum>=c[b])
  15. temp.c[b]=c[b];
  16. else
  17. temp.c[b]=sum;
  18. temp.c[a] = sum - temp.c[b];
  19. }
  20. int ok(int x,int y,int z)
  21. {
  22. return (x==c[0]/2 && y==c[0]/2) || (x==c[0]/2 && z==c[0]/2) || (y==c[0]/2 && z==c[0]/2);
  23. }
  24. void bfs()
  25. {
  26. ms(v,0);
  27. queue<node> q;
  28. tmp.c[0]=c[0];
  29. tmp.c[1]=tmp.c[2]=tmp.s=0;
  30. v[c[0]][0][0]=1;
  31. q.push(tmp);
  32. while(!q.empty())
  33. {
  34. tmp = q.front();
  35. q.pop();
  36. if(ok(tmp.c[0],tmp.c[1],tmp.c[2]))
  37. {
  38. printf("%d\n",tmp.s);
  39. return ;
  40. }
  41. for(int i=0;i<3;i++) //枚举倒水c0 、c1、c2代表三个杯子
  42. {
  43. if(tmp.c[i]>0) //不能倒完
  44. {
  45. for(int j=0;j<3;j++) //枚举接水
  46. {
  47. if(i==j) continue; //不能自己倒给自己!所以筛出6种状态(9种去掉0+0、1+1、2+2)
  48. temp = tmp; //中间变量保存原始值,因为是平行而非覆盖
  49. pour(i,j); //i——>j 变量要和temp保持一致,名字不能是别的
  50. if(!v[temp.c[0]][temp.c[1]][temp.c[2]])
  51. {
  52. temp.s++;
  53. v[temp.c[0]][temp.c[1]][temp.c[2]] = 1;
  54. q.push(temp);
  55. }
  56. }
  57. }
  58. }
  59. }
  60. printf("NO\n");
  61. }
  62. int main()
  63. {
  64. while(~scanf("%d%d%d",&c[0],&c[1],&c[2]), c[0]+c[1]+c[2])
  65. {
  66. if(c[0]&1)
  67. {
  68. printf("NO\n");
  69. continue;
  70. }
  71. bfs();
  72. }
  73. }

HDU 1495 非常可乐【BFS/倒水问题】的更多相关文章

  1. HDU 1495 非常可乐 BFS 搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...

  2. HDU 1495 非常可乐 bfs 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 第三个杯子的盛水量可由前两个杯子得到,而前两个杯子状态总数在100*100以内,穷举可实现 #includ ...

  3. (step4.2.5)hdu 1495(非常可乐——BFS)

    题目大意:输入三个整数 a,b,c.   a : 可乐瓶的容量,b: 甲杯的容量 ,c: 乙杯的容量.问能否用这三个被来实现饮料的平分???如果可以输出倒饮料的次数, 否则输出NO 解题思路:BFS ...

  4. HDU 1495 非常可乐 BFS搜索

    题意:有个为三个杯子(杯子没有刻度),体积为s,n,m,s=m+n, 刚开始只有体积为s的杯子装满可乐,可以互相倒,问你最少的次数使可乐均分,如果没有结果,输出-1; 分析:直接互相倒就完了,BFS模 ...

  5. HDU 1495 非常可乐 BFS

    题目大意:中文题不说了. 题目思路:我有同学用GCD数论写出来的代码很简洁,但是很抱歉,数论蒟蒻,我觉得比赛的时候我没办法推出.如果用BFS的话思路很简单的,就是6方向广搜,只不过稍微麻烦点.具体看代 ...

  6. HDU - 1495 非常可乐 bfs互倒三杯水

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. BFS(倒水问题) HDU 1495 非常可乐

    题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...

  8. HDU 1495 非常可乐(BFS倒水问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...

  9. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

随机推荐

  1. 【bzoj3052】[wc2013]糖果公园 带修改树上莫队

    题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...

  2. The XOR Largest Pair

    刷刷书上的例题 在给定的N个整数A1,A2……An中选出两个进行XOR运算,得到的结果最大是多少?N<=105,0<=Ai<231 SOlution: 我们思考到对于两个数相异或,是 ...

  3. Git 删除服务器的远程分支

    git push origin :分支名 可能会出现,在A机子操作,刷新下成功删除,但在B机子上还显示,再用下命令提示不存在该分支,只要再推送一个任意分支即可正常显示

  4. python3初识selenium

    第一步:安装与配置 1.电脑上需要有火狐浏览器(默认安装在C:\Program Files (x86)\Mozilla Firefox目录下). 2.使用pip install selenium安装好 ...

  5. java的哈希遍历 hashmap

    Map<String,String> map = new HashMap<String, String>(); map.put("title"," ...

  6. React 开发常见报错解决方法

    1. 使用 redux 的异步 action 时浏览器报错: Error: Actions must be plain objects. Use custom middleware for async ...

  7. DOM 2

    1.对文档的信息进行检索常用的方法: getElementById; getElementsByTagName; getAttribute;//得到的是属性值 2把需要的信息添加到DOM中常用的方法: ...

  8. Eclipse Jetty调试时无法保存js文件

    Jetty会使用内存映射文件来缓存静态文件,包括js,css文件. 在Windows下,使用内存映射文件会导致文件被锁定,所以当Jetty启动的时候无法在编辑器对js或者css文件进行编辑. 解决办法 ...

  9. CMOS与BIOS

    BIOS与CMOS的区别 : 1. 所谓BIOS,实际上就是微机的基本输入输出系统(Basic Input-Output System),其内容集成在微机主板上的一个ROM芯片上,主要保存着有关微机系 ...

  10. oracle12c创建用户等问题

    一:前言 这几天我重新装了下电脑,然后自己有试着去装了下oracle11g,结果还是失败了然后我自己又去下载了最新的oracle12c,oracle12c中有两个用户sys和system,scott已 ...