题目链接:https://vjudge.net/problem/HDU-1495

题意:有两个空杯(分别是N升和M升)和一罐满的可乐S升,S = N + M,三个容器可以互相倾倒,如果A倒入B,只有两种情况:
(1) A全部倒入B中,B中的升数小于等于B的最大容量。
(2)A部分倒入B中,B已经到达了B的最大容量。
问:有没有可能把S升的可乐平分在任意两个容器中,有的话得出最少操作次数,否则输出“NO”。

思路:bfs,把六种情况都模拟枚举(代码写的比较形象),需要标记出现过的三个容器的容量情况,否则会TLE。


 #include <iostream>
#include <cstring>
#include<vector>
#include<string>
#include <cmath>
#include <map>
#include <queue>
#include <algorithm>
using namespace std; #define inf (1LL << 31) - 1
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) int NL, ML, SL, AVE;
//bool vis[110][110][110]; struct node{ int N, M, S, V; node(int a, int b, int c, int d){
N = a;
M = b;
S = c;
V = d;
} //这里面内嵌的 if表示(1)情况
// else表示(2)情况
void Pour(int f, int s){ if (f == ){
if (s == ){
int t = ML - M;
if (N >= t) N -= t, M = ML; //(1)
else M += N, N = ; //(2)
}
else if (s == ){
int t = SL - S;
if (N >= t) N -= t, S = SL;
else S += N, N = ;
}
}
else if (f == ){
if (s == ){
int t = NL - N;
if (M >= t) M -= t, N = NL;
else N += M, M = ;
}
else if (s == ){
int t = SL - S;
if (M >= t) M -= t, S = SL;
else S += M, M = ;
}
}
else if (f == ){
if (s == ){
int t = NL - N;
if (S >= t) S -= t, N = NL;
else N += S, M = ;
}
else if (s == ){
int t = ML - M;
if (S >= t) S -= t, M = ML;
else M += S, S = ;
}
}
} }; //可以看出,我用了两个方法都可以标记情况
void bfs(){ map<pair<int, int>, bool> mp;//标记三个容器的容量情况,防止出下过的再次出现在队列中
pair<int, int > p(, );
mp[p] = true;
node in(, , SL, );
// vis[in.N][in.M][in.S] = true;
queue<node> que;
que.push(in); while (!que.empty()){ node tmp = que.front();
que.pop(); //六种情况,Pour(x,y) 把X中的倒入y中,应该是很清楚了
rep(i, , ){
node t = tmp; if (i == ) t.Pour(, );
else if (i == ) t.Pour(, );
else if (i == ) t.Pour(, );
else if (i == ) t.Pour(, );
else if (i == ) t.Pour(, );
else if (i == ) t.Pour(, ); //检查有没有出现平分了
int key = ;
if (t.N == AVE) key++;
if (t.M == AVE) key++;
if (t.S == AVE) key++;
//平分了
if (key >= ){
cout << tmp.V + << endl;
return;
} p.first = t.N;
p.second = t.M;
pair<int, int > p(t.N, t.M);
if (!mp[p]/*!vis[t.N][t.M][t.S]*/){
mp[p] = true;
// vis[t.N][t.M][t.S] = true;
que.push(node{ t.N, t.M, t.S, tmp.V + });
}
}
} cout << "NO" << endl;
} int main(){ ios::sync_with_stdio(false);
cin.tie(); while (cin >> SL >> NL >> ML){ memset(vis, , sizeof(vis)); if (NL == && ML == && SL == ) break;
AVE = SL / ;
if (SL & ){
cout << "NO" << endl;
continue;
}
bfs();
} return ;
}

kuangbin专题 专题一 简单搜索 非常可乐 HDU - 1495的更多相关文章

  1. kuangbin专题总结一 简单搜索

    A - 棋盘问题:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...

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

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

  3. 非常可乐 HDU - 1495

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

  4. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  5. [kuangbin带你飞]专题一 简单搜索

            ID Origin Title 454 / 1008 Problem A POJ 1321 棋盘问题   328 / 854 Problem B POJ 2251 Dungeon Ma ...

  6. 简单搜索 kuangbin C D

    C - Catch That Cow POJ - 3278 我心态崩了,现在来回顾很早之前写的简单搜索,好难啊,我怎么写不出来. 我开始把这个写成了dfs,还写搓了... 慢慢来吧. 这个题目很明显是 ...

  7. ElasticSearch 5学习(4)——简单搜索笔记

    空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...

  8. nyoj 284 坦克大战 简单搜索

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...

  9. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

随机推荐

  1. WPF SystemParameters的使用

    SubWindow win = new SubWindow();                //win.Width = SystemParameters.WorkArea.Width;      ...

  2. <转>C# 动态创建DataTable

    C# 动态创建DataTable,有时候在做些测试Demo中用来模拟一些数据比较不错.记在这里避免以后重写呵呵... DataTable dt = new DataTable(); dt.Column ...

  3. C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形

    原文:C#如何在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形 在VS2015 2017版本中编写WPF UI界面引入第三方SVG图形     最近在写WPF界面的时候遇到一个情 ...

  4. Qt之使用setWindowFlags方法遇到的问题(追踪进入QWidget的源码分析原因,最后用WINAPI解决问题)good

    一.简述 前段时间在使用setWindowFlags方法时遇到了一个坑,具体情况是想通过窗口界面上一个checkBox来控制窗口当前状态是否置顶,而Qt提供了Qt::WindowStaysOnTopH ...

  5. windows media player 播放视频

    一.新建windows应用程序项目,添加vedioForm窗体 二.在com组件中找到windows media player,添加引用 三.代码如下: public partial class Ve ...

  6. WPF应用程序嵌入第三方exe

    把其它应用嵌入到C#窗口 源代码-CSDN下载 https://download.csdn.net/download/aiqinghee/10652732 WPF应用程序嵌入第三方exe - gao2 ...

  7. 第一次做C++项目的一点小总结

    本人原本一菜鸟java程序员,但业余涉猎还算广泛,稍微了解些C++内容.主要之前曾爱好过汇编语言.所以对于C语言能从汇编层面加以理解,C++则是在此基础上又加了面向对象.stl等一类东西嘛. 这次做了 ...

  8. MySQL中临时表的基本创建与使用教程(CREATETEMPORARY TABLE)

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  9. 腾讯移动Web整体解决方案Spirit

    Spirit(勇气号),美国航天局NASA派往Mars(火星)的第一艘探测器.移动Web开发是一块新的领域,甚至有很多坑,这一点与人类从未踏上的Mars(火星)相似.为了避免开发者重复遇到相同的问题, ...

  10. ring3层一种占用文件的方法(DuplicateHandle以后,把占用文件的句柄丢给系统进程,导致被占用)

    前段时间,一个测试工程师问我关于怎样长时间的占用一个文件,而使别的程序无法再访问这个文件,想起以前很多病毒木马经常劫持hosts文件不放,除非你找到占用文件的程序,并强行结束掉,否则怎么也访问不了ho ...