HDU 1495 很可乐(BFS 倒水问题)
题意 将体积为s的可乐 利用容积分别为n和m的两个杯子平均分为两份 至少须要倒多少次可乐
能够把容器s,n,m中装的可乐量看成一种状态
容器都是没有刻度的 所以每次倒可乐要么把自己倒完 要么把对方倒满
每种状态能够通过一次倒水到达哪些状态 于是能够通过bfs推断到达每种状态须要倒多少次
3个容器中有一个装的可乐为s/2的状态就是答案了 s是奇数时明显不可能平分的 能够直接忽略
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 105;
int v[N][N][N], n, m, s, le, ri; struct state {
int a, b, c, d;
state() {}
state(int e, int f, int g, int h)
: a(e), b(f), c(g), d(h) {}
} q[N * N * N]; void pour(int a, int b, int c, int d)
{
if(!v[a][b][c])
{
v[a][b][c] = 1;
q[ri++] = state(a, b, c, d + 1);
}
} int bfs()
{
int a, b, c, d;
le = ri = 0;
q[ri++] = state(s, 0, 0, 0);
memset(v, 0, sizeof(v));
v[s][0][0] = 1;
while(le < ri)
{
a = q[le].a, b = q[le].b, c = q[le].c, d = q[le++].d;
if(a == s / 2 || b == s / 2 || c == s / 2)
return d + (a && b && c != 0);
pour(a - n + b, n, c, d); //s->n:
pour(a - m + c, b, m, d); //s->m;
pour(a + b, 0, c, d); //n->s;
pour(a + c, b, 0, d); //m->s;
if(b > m - c) pour(a, b - m + c, m, d); //n->m
else pour(a, 0, b + c, d);
if(c > n - b) pour(a, n, c - n + b, d); //m->n
else pour(a, b + c, 0, d);
}
return 0;
} int main()
{
int ans;
while(scanf("%d%d%d", &s, &n, &m), n)
{
ans = 0;
if (s % 2 == 0) ans = bfs();
if(!ans) puts("NO");
else printf("%d\n", ans);
}
return 0;
}
很可乐
由于每次当seeyou买了可乐以后。阿牛就要求和seeyou一起分享这一瓶可乐。并且一定要喝的和seeyou一样多。但seeyou的手中仅仅有两个杯子,它们的容量各自是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间能够相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?假设能请输出倒可乐的最少的次数,假设不能输出"NO"。
7 4 3
4 1 3
0 0 0
NO
3
HDU 1495 很可乐(BFS 倒水问题)的更多相关文章
- HDU 1495  很可乐  (DFS)
		
题目链接:很可乐 解析:一个瓶子,容量为s.两个杯子,容量分别为n和m,问最少多少次倾倒才干将一瓶可乐均分为两份. 直接模拟每次的倾倒.然后递归求解. 能够加个预判的条件,要是s是奇数的时候,不管怎样 ...
 - HDU 1495 非常可乐(BFS倒水问题)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...
 - HDU 1495 非常可乐【BFS/倒水问题】
		
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
 - HDU 1495 非常可乐【BFS】
		
题目链接:https://vjudge.net/problem/HDU-1495 转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/6750320.ht ...
 - HDU - 1495 非常可乐  【BFS】
		
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1495 思路 首先 如果可乐的体积 是奇数 那么是无解的 然后 如果能够得到两杯 都是一般容量的可乐 那 ...
 - (中等)  HDU  1495  非常可乐,BFS。
		
Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享 这一瓶可乐,而且一定要喝的和s ...
 - HDU.1495 非常可乐 (BFS)
		
题意分析 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多 ...
 - BFS(倒水问题) HDU 1495 非常可乐
		
题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...
 - 【BFS】HDU 1495
		
直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...
 
随机推荐
- 题解 P2068 【统计和】
			
这是一道单点修改,区间查询的线段树. 需要实现的操作有三个:建树,更新与查询. 首先,线段树用结构体维护,如下: struct node { int l, r; int val; } tree[max ...
 - 洛谷 P1443 马的遍历
			
P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘 ...
 - iOS 开发百问(5)
			
42. 警告:Multiplebuild commands for output file target引用了名字反复的资源 找到当前的target,展开之后.找到CopyBundle Resourc ...
 - vim 脚本之快速打印log
			
" zsl_log.vim " Version: 1.0 if exists("g:zsl_loaded_log") || &cp || v:versi ...
 - CSS的水平居中和垂直居中解决方案
			
在写CSS样式的时候,有时为了美观,会添加水平居中和垂直居中,这时候你有可能会遇到很棘手的问题,有些水平居中和垂直居中的属性添加上去完全没反应,下面给大家列举一些CSS水平居中和垂直居中的终极解决方案 ...
 - 学习推荐《从Excel到Python数据分析进阶指南》高清中文版PDF
			
Excel是数据分析中最常用的工具,本书通过Python与Excel的功能对比介绍如何使用Python通过函数式编程完成Excel中的数据处理及分析工作.在Python中pandas库用于数据处理,我 ...
 - 【Linux环境编程】获取网卡的实时网速
			
在windows以下.我们能够看到360或者是qq安全卫士的"安全球".上面显示实时的网速情况.那么在linux里面怎样获取网卡的实时网速?事实上原理非常easy,读取须要获取网速 ...
 - 在OEL 5.4 32bit上使用yum install命令遇到的问题
			
在OEL 5.4 32bit上使用yum install命令遇到的问题 [root@localhost yum.repos.d]# yum install elfutils-libelf-devel- ...
 - SQL解析器的性能測试
			
对同一个sql语句,使用3种解析器解析出ast语法树(这是编译原理上的说法,在sql解析式可能就是解析器自己定义的statement类型).运行100万次的时间对照. package demo.tes ...
 - POJ2823 Sliding Window【双端队列】
			
求连续的k个中最大最小值,k是滑动的,每次滑动一个 用双端队列维护可能的答案值 假设要求最小值,则维护一个单调递增的序列 对一開始的前k个,新增加的假设比队尾的小.则弹出队尾的,直到新增加的比队尾大. ...