大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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

  1. 7 4 3
  2. 4 1 3
  3. 0 0 0

Sample Output

  1. NO
  2. 3

BFS暴力搜索可解。倒水只可能有六种情况,s->m s->n m->s m-->n n->s n->m 每种情况里分为能把待倒入的瓶子倒满和不能倒满。这里可以用一个结构体记录信息:s代表原瓶里的可乐容量,m代表m瓶里的,n代表n瓶里的,nxt代表下一次要往外倒可乐的瓶号(0代表s瓶,1代表m瓶,2代表n瓶),cnt代表倒可乐累积的次数。再建立一个vis数组判断是否访问过。要注意的是这里最好建四维数组,三维存s,m,n,第四维存nxt。BFS即可,注释写得很详细。

最后附上大佬的数论解法https://www.cnblogs.com/ECJTUACM-873284962/p/6750320.html

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. using namespace std;
  6. int s,n,m;
  7. struct node
  8. {
  9. int s;
  10. int m;
  11. int n;
  12. int cnt;
  13. int nxt;//下一次该哪个杯子往外倒水 0 s 1 m 2 n
  14. };
  15. bool vis[][][][]={};//四维vis数组存是否访问过
  16. int bfs()
  17. {
  18. node start;
  19. start.s=s;
  20. start.n=;//初始化第一层信息
  21. start.m=;
  22. start.cnt=;
  23. start.nxt=;
  24. queue<node>q;
  25. q.push(start);
  26. memset(vis,,sizeof(vis));
  27. while(q.size())
  28. {
  29. node pre=q.front();
  30. q.pop();
  31. if((pre.s==pre.n&&pre.s==s/)||(pre.s==pre.m&&pre.s==s/)||(pre.n==pre.m&&pre.n==s/))//是否搜到
  32. {
  33. return pre.cnt;
  34. }
  35. if(vis[pre.s][pre.m][pre.n][pre.nxt])//访问过的话直接continue
  36. {
  37. continue;
  38. }
  39. vis[pre.s][pre.m][pre.n][pre.nxt]=;
  40. int pour=pre.nxt;
  41. node next;
  42. if(pour==)//s往n m倒水
  43. {
  44. //s往n
  45. if(n-pre.n<pre.s) //能倒满
  46. {
  47. next.s=pre.s-(n-pre.n);//更新下一层的信息
  48. next.m=pre.m;
  49. next.n=n;
  50. next.cnt=pre.cnt+;
  51. next.nxt=;
  52. if(next.s!=)q.push(next);//不为0的话再添加 要不然瓶子里都没可乐了也就倒不出来了
  53. next.nxt=;
  54. if(next.m!=)q.push(next);
  55. next.nxt=;
  56. if(next.n!=)q.push(next);//如果只是三维vis数组的话 加进去三个s m n一样但nxt不一样的 后两个都被vis判定卡掉了 所以要换成四维
  57. }
  58. else if(n-pre.n>=s)//不能倒满
  59. {
  60. next.s=;
  61. next.m=pre.m;
  62. next.n=pre.n+pre.s;
  63. next.cnt=pre.cnt+;
  64. next.nxt=;
  65. if(next.s!=)q.push(next);
  66. next.nxt=;
  67. if(next.m!=)q.push(next);
  68. next.nxt=;
  69. if(next.n!=)q.push(next);
  70. }
  71. //s往m
  72. if(m-pre.m<pre.s)
  73. {
  74. next.s=pre.s-(m-pre.m);
  75. next.n=pre.n;
  76. next.m=m;
  77. next.cnt=pre.cnt+;
  78. next.nxt=;
  79. if(next.s!=)q.push(next);
  80. next.nxt=;
  81. if(next.m!=)q.push(next);
  82. next.nxt=;
  83. if(next.n!=)q.push(next);
  84. }
  85. else if(m-pre.m>=pre.s)
  86. {
  87. next.s=;
  88. next.n=pre.n;
  89. next.m=pre.m+pre.s;
  90. next.cnt=pre.cnt+;
  91. next.nxt=;
  92. if(next.s!=)q.push(next);
  93. next.nxt=;
  94. if(next.m!=)q.push(next);
  95. next.nxt=;
  96. if(next.n!=)q.push(next);
  97. }
  98.  
  99. }
  100. else if(pour==)//m往 s n
  101. {
  102. //m往s
  103. if(s-pre.s<pre.m)
  104. {
  105. next.m=pre.m-(s-pre.s);
  106. next.n=pre.n;
  107. next.s=s;
  108. next.cnt=pre.cnt+;
  109. next.nxt=;
  110. if(next.s!=)q.push(next);
  111. next.nxt=;
  112. if(next.m!=)q.push(next);
  113. next.nxt=;
  114. if(next.n!=)q.push(next);
  115. }
  116. else if(s-pre.s>=pre.m)
  117. {
  118. next.m=;
  119. next.n=pre.n;
  120. next.s=pre.s+pre.m;
  121. next.cnt=pre.cnt+;
  122. next.nxt=;
  123. if(next.s!=)q.push(next);
  124. next.nxt=;
  125. if(next.m!=)q.push(next);
  126. next.nxt=;
  127. if(next.n!=)q.push(next);
  128. }
  129. //m往n
  130. if(n-pre.n<pre.m)
  131. {
  132. next.m=pre.m-(n-pre.n);
  133. next.s=pre.s;
  134. next.n=n;
  135. next.cnt=pre.cnt+;
  136. next.nxt=;
  137. if(next.s!=)q.push(next);
  138. next.nxt=;
  139. if(next.m!=)q.push(next);
  140. next.nxt=;
  141. if(next.n!=)q.push(next);
  142. }
  143. else if(n-pre.n>=pre.m)
  144. {
  145. next.m=;
  146. next.s=pre.s;
  147. next.n=pre.n+pre.m;
  148. next.cnt=pre.cnt+;
  149. next.nxt=;
  150. if(next.s!=)q.push(next);
  151. next.nxt=;
  152. if(next.m!=)q.push(next);
  153. next.nxt=;
  154. if(next.n!=)q.push(next);
  155. }
  156. }
  157. else if(pour==)//n往s m
  158. {
  159. //n往s
  160. if(s-pre.s<pre.n)
  161. {
  162. next.n=pre.n-(s-pre.s);
  163. next.m=pre.m;
  164. next.s=s;
  165. next.cnt=pre.cnt+;
  166. next.nxt=;
  167. if(next.s!=)q.push(next);
  168. next.nxt=;
  169. if(next.m!=)q.push(next);
  170. next.nxt=;
  171. if(next.n!=)q.push(next);
  172. }
  173. else if(s-pre.s>=pre.n)
  174. {
  175. next.n=;
  176. next.m=pre.m;
  177. next.s=pre.s+pre.n;
  178. next.cnt=pre.cnt+;
  179. next.nxt=;
  180. if(next.s!=)q.push(next);
  181. next.nxt=;
  182. if(next.m!=)q.push(next);
  183. next.nxt=;
  184. if(next.n!=)q.push(next);
  185. }
  186. //n往m
  187. if(m-pre.m<pre.n)
  188. {
  189. next.n=pre.n-(m-pre.m);
  190. next.s=pre.s;
  191. next.m=m;
  192. next.cnt=pre.cnt+;
  193. next.nxt=;
  194. if(next.s!=)q.push(next);
  195. next.nxt=;
  196. if(next.m!=)q.push(next);
  197. next.nxt=;
  198. if(next.n!=)q.push(next);
  199. }
  200. else if(m-pre.m>=pre.n)
  201. {
  202. next.n=;
  203. next.s=pre.s;
  204. next.m=pre.m+pre.n;
  205. next.cnt=pre.cnt+;
  206. next.nxt=;
  207. if(next.s!=)q.push(next);
  208. next.nxt=;
  209. if(next.m!=)q.push(next);
  210. next.nxt=;
  211. if(next.n!=)q.push(next);
  212. }
  213. }
  214. }
  215. return ;
  216. }
  217. int main()
  218. {
  219. while(scanf("%d%d%d",&s,&m,&n)&&s&&n&&m)
  220. {
  221. if(s%!=)
  222. {
  223. cout<<"NO"<<endl;
  224. continue;
  225. }
  226. int ans=bfs();
  227. if(ans)
  228. {
  229. cout<<ans<<endl;
  230. continue;
  231. }
  232. else
  233. {
  234. cout<<"NO"<<endl;
  235. continue;
  236. }
  237. }
  238. return ;
  239. }


HDU1495 非常可乐(BFS/数论)的更多相关文章

  1. HDU1495 非常可乐 —— BFS + 模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 非常可乐 Time Limit: 2000/1000 MS (Java/Others)    M ...

  2. HDU-1495 非常可乐(BFS)

    广搜的灵活应用题: 非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  3. 非常可乐(杭电hdu1495)bfs

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

  4. HDU 1495 非常可乐 BFS

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

  5. HDU-1495 非常可乐 (嵌套结构体-广搜 对比 一般广搜)

    题意 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但 ...

  6. HDU1459 非常可乐(BFS) 2016-07-24 15:00 165人阅读 评论(0) 收藏

    非常可乐 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶 ...

  7. HDU1664 BFS + 数论 + 剪枝

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1664 , 一道比较蛋疼的搜索题. 这道题有很多坑点,一点处理不好就要TLE. 题意很简单,就是找到一个 ...

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

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

  9. HDU1495 非常可乐

    解题思路:简单的宽搜,见代码: #include<cstdio> #include<cstring> #include<algorithm> #include< ...

随机推荐

  1. selenium的元素定位方法-By

    如果在定位元素属性中包含了如ID等元素属性,那么在一个测试中,定位方法具体有哪几种,可以参考by模块中的By类,By的代码如下: class By(object): """ ...

  2. 每天进步一点点------Allegro PCB命名规则

    PCB命名规则-allegro 一.焊盘命名规则 1. 贴片矩形焊盘  命名规则:SMD+长(L)+宽(W)(mil) 举例:SMD90X60 2. 贴片圆焊盘   命名规则:SMDC+焊盘直径(D) ...

  3. 大白话Web三大组件之一Servlet

    很多学习到Servlet这里的童鞋,听到那么多专业名词解释这个Servlet,相信都是很蒙圈的,在这里我先不跟大家扯Servlet的大概念,先跟大家探讨一下关于Servlet的作用 相信MVC这个概念 ...

  4. Codeforces A. Serval and Bus

    inputstandard inputoutputstandard outputIt is raining heavily. But this is the first day for Serval, ...

  5. CSS中的z-index属性如何使用

    z-index属性介绍 只有设置了定位我们才会使用到该z-index属性,如:固定定位.相对定位.绝对定位. 定位元素默认的z-index属性值是0. 如果2个定位的元素都没有设置z-index属性, ...

  6. IntelliJ IDEA 2017.3尚硅谷-----安装

    选择路径 安装目录 bin目录下的文件 启动文件 虚拟机的配置信息 -Xms128m 初始内存 -Xmx750m 最大内存-XX:ReservedCodeCacheSize=240m 可保留代码缓存的 ...

  7. JSON--WEB SERVICE

    Query ajax webservice:get 和 post 一.GET 方式 客户端 复制代码代码如下: var data = { classCode: "0001"}; / ...

  8. SQL Server 函数大全

    本文链接:https://blog.csdn.net/qq_15028299/article/details/81330854SQL2008 表达式:是常量.变量.列或函数等与运算符的任意组合.htt ...

  9. 【想见你】剧情解析byZlc

    花两天时间刷完了想见你,精神有点恍惚. 要是刷题也能有这个尽头就好了... 下面给大家带来个人的剧(hu)情(bian)解(luan)析(zao) 穿越条件:一台老式随身听,一首last dance, ...

  10. Flask的基本使用

    最基本的一个Flask模板,实现本地9898端口访问,页面返回hello world from flask import Flask app = Flask(__name__) @app.route( ...