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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int s,n,m;
struct node
{
int s;
int m;
int n;
int cnt;
int nxt;//下一次该哪个杯子往外倒水 0 s 1 m 2 n
};
bool vis[][][][]={};//四维vis数组存是否访问过
int bfs()
{
node start;
start.s=s;
start.n=;//初始化第一层信息
start.m=;
start.cnt=;
start.nxt=;
queue<node>q;
q.push(start);
memset(vis,,sizeof(vis));
while(q.size())
{
node pre=q.front();
q.pop();
if((pre.s==pre.n&&pre.s==s/)||(pre.s==pre.m&&pre.s==s/)||(pre.n==pre.m&&pre.n==s/))//是否搜到
{
return pre.cnt;
}
if(vis[pre.s][pre.m][pre.n][pre.nxt])//访问过的话直接continue
{
continue;
}
vis[pre.s][pre.m][pre.n][pre.nxt]=;
int pour=pre.nxt;
node next;
if(pour==)//s往n m倒水
{
//s往n
if(n-pre.n<pre.s) //能倒满
{
next.s=pre.s-(n-pre.n);//更新下一层的信息
next.m=pre.m;
next.n=n;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);//不为0的话再添加 要不然瓶子里都没可乐了也就倒不出来了
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);//如果只是三维vis数组的话 加进去三个s m n一样但nxt不一样的 后两个都被vis判定卡掉了 所以要换成四维
}
else if(n-pre.n>=s)//不能倒满
{
next.s=;
next.m=pre.m;
next.n=pre.n+pre.s;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
//s往m
if(m-pre.m<pre.s)
{
next.s=pre.s-(m-pre.m);
next.n=pre.n;
next.m=m;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
else if(m-pre.m>=pre.s)
{
next.s=;
next.n=pre.n;
next.m=pre.m+pre.s;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
} }
else if(pour==)//m往 s n
{
//m往s
if(s-pre.s<pre.m)
{
next.m=pre.m-(s-pre.s);
next.n=pre.n;
next.s=s;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
else if(s-pre.s>=pre.m)
{
next.m=;
next.n=pre.n;
next.s=pre.s+pre.m;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
//m往n
if(n-pre.n<pre.m)
{
next.m=pre.m-(n-pre.n);
next.s=pre.s;
next.n=n;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
else if(n-pre.n>=pre.m)
{
next.m=;
next.s=pre.s;
next.n=pre.n+pre.m;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
}
else if(pour==)//n往s m
{
//n往s
if(s-pre.s<pre.n)
{
next.n=pre.n-(s-pre.s);
next.m=pre.m;
next.s=s;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
else if(s-pre.s>=pre.n)
{
next.n=;
next.m=pre.m;
next.s=pre.s+pre.n;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
//n往m
if(m-pre.m<pre.n)
{
next.n=pre.n-(m-pre.m);
next.s=pre.s;
next.m=m;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
else if(m-pre.m>=pre.n)
{
next.n=;
next.s=pre.s;
next.m=pre.m+pre.n;
next.cnt=pre.cnt+;
next.nxt=;
if(next.s!=)q.push(next);
next.nxt=;
if(next.m!=)q.push(next);
next.nxt=;
if(next.n!=)q.push(next);
}
}
}
return ;
}
int main()
{
while(scanf("%d%d%d",&s,&m,&n)&&s&&n&&m)
{
if(s%!=)
{
cout<<"NO"<<endl;
continue;
}
int ans=bfs();
if(ans)
{
cout<<ans<<endl;
continue;
}
else
{
cout<<"NO"<<endl;
continue;
}
}
return ;
}


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. Linux - Shell - find - 基础

    概述 find 基础 背景 查找文件 人的记忆能力, 是有限的 计算机里的文件数量, 虽然不是无限, 但是也不少 要去找那些 记不清楚的文件, 必然要用查找 准备 OS centos7 用户 root ...

  2. Linux中 /boot 目录介绍

    转自https://blog.csdn.net/dulin201004/article/details/7396968 一./boot/目录中的文件和目录 Linux系统在本地启动时,目录/boot/ ...

  3. SAIF anno

    https://www.cnblogs.com/IClearner/p/6898463.html SAIF--RTL BACK分析法 RTL backward SAIF文件是通过对RTL代码进行仿真得 ...

  4. Laravel 部署到阿里云 / 腾讯云

    首先你需要一台阿里云/腾讯云服务器 安装系统选择 ubuntu 16.04 然后通过 ssh 登录远程服务器按下列步骤进行配置: 更新列表 apt-get update 安装语言包 sudo apt- ...

  5. 矩阵快速幂+概率DP poj 3744

    题意:在一条不满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问 ...

  6. Knapsack Cryptosystem 牛客团队赛

    时限2s题意: 第一行包含两个整数,分别是n(1 <= n <= 36)和s(0 <= s <9 * 10 18) 第二行包含n个整数,它们是{a i }(0 <a i ...

  7. 外键约束:foreign key

    *外键 foreign key* 1.概念:如果一个实体的(student)的某个字段,指向(引用)另个实体(class)的主键 (class:class_id),就称为student实体的class ...

  8. Postman 设置token为全局变量

    在做接口测试的时候,经常会用到不同用户登陆的token,来测试API,通过设置全局的token,这样更便捷: 注意设置的名称必须与你登陆后返回的名称一致,我这里是 AccessToken 1.配置环境 ...

  9. Github Pull Request的提出与采纳

    这一文来简要介绍一下Github Pull Request(以下简称PR)的使用方法: 作为PR的提出者,如何对某个仓库提交PR,如何根据仓库管理者对所提交PR的反馈对PR进行完善 作为PR的接收者, ...

  10. .Net Core 认证组件之Cookie认证组件解析源码

    接着上文.Net Core 认证系统源码解析,Cookie认证算是常用的认证模式,但是目前主流都是前后端分离,有点鸡肋但是,不考虑移动端的站点或者纯管理后台网站可以使用这种认证方式.注意:基于浏览器且 ...