这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过...

  本题大意:给出可乐的体积v1,给出两个杯子v2和v3,要求v2 + v3 == v1,每次只能从一个杯子倒到另一个杯子,问最少倒多少次可以将可乐平分。

  思路:最后可乐肯定在可乐瓶和大杯子里面,直接BFS暴搜就行了。

  参考代码:

 #include <cstdio>
#include <queue>
#include <cstring>
using namespace std; struct node {
int cur[], step;
} now, Next; const int maxn = + ;
int v[];
int ans, t;
bool flag;
bool vis[maxn][maxn][maxn]; void bfs() {
if(v[] & ) {
flag = false;
return;
}
queue <node> Q;
now.cur[] = v[], now.cur[] = , now.cur[] = , now.step = ;
vis[v[]][][] = true;
Q.push(now);
while(!Q.empty()) {
now = Q.front();
Q.pop();
if(now.cur[] == now.cur[] && now.cur[] == ) {
ans = now.step;
return;
}
for(int i = ; i < ; i ++) {//i -> j
for(int j = ; j < ; j ++) {
if(i != j) {
Next = now;
t = now.cur[i] + now.cur[j];
if(t > v[j]) Next.cur[j] = v[j];
else Next.cur[j] = t;
Next.cur[i] = t - Next.cur[j];
if(!vis[Next.cur[]][Next.cur[]][Next.cur[]]) {
Next.step = now.step + ;
Q.push(Next);
vis[Next.cur[]][Next.cur[]][Next.cur[]] = true;
}
}
}
}
}
flag = false;
} int main () {
while(~scanf("%d %d %d", &v[], &v[], &v[])) {
memset(vis, false, sizeof(vis));
if(v[] == && v[] == && now.cur[] == ) break;
flag = true, ans = ;
if(v[] < v[]) {
t = v[];
v[] = v[];
v[] = t;
}
bfs();
if(flag) printf("%d\n", ans);
else printf("NO\n");
}
return ;
}

  下面这个代码的效率要高一点,区别在于倒水方式不同。

 #include <cstdio>
#include <queue>
#include <cstring>
using namespace std; struct node {
int cur[], step;
} now, Next; const int maxn = + ;
int v[];
int ans, t;
bool flag;
bool vis[maxn][maxn][maxn]; void bfs() {
if(v[] & ) {
flag = false;
return;
}
queue <node> Q;
now.cur[] = v[], now.cur[] = , now.cur[] = , now.step = ;
vis[v[]][][] = true;
Q.push(now);
while(!Q.empty()) {
now = Q.front();
Q.pop();
if(now.cur[] == now.cur[] && now.cur[] == ) {
ans = now.step;
return;
}
for(int i = ; i < ; i ++) {//i -> j
for(int j = ; j < ; j ++) {
if(i != j) {
Next = now;
if(j == ) {
Next.cur[j] = now.cur[j] + now.cur[i];
Next.cur[i] = ;
} else if(j == ) {
t = v[] - now.cur[j];
Next.cur[i] = now.cur[i] - t;
Next.cur[i] = Next.cur[i] > ? Next.cur[i] : ;
Next.cur[j] = now.cur[j] + now.cur[i];
Next.cur[j] = Next.cur[j] < v[] ? Next.cur[j] : v[];
} else {
t = v[] - now.cur[j];
Next.cur[i] = now.cur[i] - t;
Next.cur[i] = Next.cur[i] > ? Next.cur[i] : ;
Next.cur[j] = now.cur[j] + now.cur[i];
Next.cur[j] = Next.cur[j] < v[] ? Next.cur[j] : v[];
}
if(!vis[Next.cur[]][Next.cur[]][Next.cur[]]) {
Next.step = now.step + ;
Q.push(Next);
vis[Next.cur[]][Next.cur[]][Next.cur[]] = true;
}
}
}
}
}
flag = false;
} int main () {
while(~scanf("%d %d %d", &v[], &v[], &v[])) {
memset(vis, false, sizeof(vis));
if(v[] == && v[] == && now.cur[] == ) break;
flag = true, ans = ;
if(v[] < v[]) {
t = v[];
v[] = v[];
v[] = t;
}
bfs();
if(flag) printf("%d\n", ans);
else printf("NO\n");
}
return ;
}

HDU-1459.非常可乐(BFS )的更多相关文章

  1. HDU 1495 非常可乐 BFS 搜索

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

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

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

  3. HDU 1495 非常可乐 BFS搜索

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

  4. HDU 1495 非常可乐 BFS

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

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

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

  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)

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

  9. 非常可乐---hdu 1495(BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意: 有3个杯子a b c:a=b+c:然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相 ...

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

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

随机推荐

  1. C# 中的 ConfigurationManager类引用方法

    c#添加了Configuration;后,竟然找不到 ConfigurationManager 这个类,后来才发现:虽然引用了using System.Configuration;这个包,但是还是不行 ...

  2. 【JEECG技术文档】JEECG在线聊天插件功能集成文档

    原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...

  3. 【技术文档】jeecg3.7.3-maven搭建环境入门

    JEECG 微云快速开发平台(3.7.3)Eclipse-Maven版本手把手入门手册 官方标准开发工具:1. IDE        Eclipse Java EE IDE for Web Devel ...

  4. 正则表达式(TypeScript, JavaScript)

    课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...

  5. SQL Server--存在则更新问题

    在博客园看到一篇讨论特别多的文章“探讨SQL Server并发处理存在就更新七种解决方案”,这种业务需求很常见:如果记录存在就更新,不存在就插入. 最常见的做法: BEGIN TRANSACTION ...

  6. 12.常用类简单介绍.md

    目录 1.Scanner类 2.System类 4.Object类和工具类 5.StringBuffer类和StringBuilder类 6.Math类 7.Random类和ThreadLocalRa ...

  7. 开发一个FTP软件

    一.开发一个多并发的FTP server 需求: .允许同时支持多用户在线 .用户认证 .用户空间配额 .权限限制 .可上传下载.上传下载过程中显示进度条 .用户可远程切换目录.查看服务端文件列表等 ...

  8. KJMusic完整音乐项目

    KJMusic完整音乐项目 KJMusic是一个完整音乐项目,这个项目从欢迎页面到首页以及音乐播放页面都做得非常不错.并且本音乐支持本地音乐,和音乐电台,支持切换上下首个.本项目还支持侧滑出现menu ...

  9. ftp 传输问题

    服务器配置ftp站点后,客户端机器可以下载但不能上传文件? 今天从公网的服务器连接本地内网的FTP server copy文件时,系统老是提示227 Entering Passive Mode (xx ...

  10. linux 内核根文件系统

    参考: http://blog.csdn.net/guopeixin/article/details/5962482 http://www.yunweipai.com/archives/1184.ht ...