题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻,某个杯子里的水dd,和d相同,或者无限接近。让求最少的倒水量和dd(可能和d相同)。
解析:用bfs枚举所有的状态,就是把i里面的水倒到j里面,在这里学到了用node的优先队列,内部书写也是要记一记.其他代码里面会有注释.

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define pb push_back
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rep1(i,b,a) for(int i=b;i>=a;i--)
using namespace std;
const int maxn = 200 + 5;
struct node
{int val[3], d;bool operator < (const node &p) const{return d > p.d;}
};
int vis[maxn][maxn], ans[maxn];void update(const node &u)
{//及时更新倒水量for(int i = 0; i < 3; ++i){int v = u.val[i];if(ans[v] < 0 )  ans[v] = u.d;}
}void bfs(int a, int b, int c, int d)
{int cap[] = {a, b, c};//容量大小priority_queue<node> q;//优先队列memset(vis, 0, sizeof(vis));memset(ans, -1, sizeof(ans));node u;u.val[0] = 0;  u.val[1] = 0;//开始的状态u.val[2] = c;  u.d = 0;q.push(u);vis[0][0] = 1;//前两种容器即可查重while(!q.empty()){u = q.top();  q.pop();update(u);if(ans[d] >= 0)  break;//找到d了 及时退出for(int i = 0; i < 3; ++i)for(int j = 0; j < 3; ++j){if(i == j || !u.val[i] || u.val[j] == cap[j])  continue;//i 是空的,或者 j 是已经满了node v;    memcpy(&v, &u, sizeof(u));int t = min(cap[j], v.val[i]+v.val[j]) - v.val[j];//找倒水量,要么倒满,要么倒空v.val[i] -= t;v.val[j] += t;v.d += t;if(vis[v.val[0]][v.val[1]])  continue;vis[v.val[0]][v.val[1]] = 1;//标记的不是 vis[v.val[j]][v.val[j]]q.push(v);}}while(d >= 0){if(ans[d] >= 0){cout<<ans[d]<<' '<<d<<endl;  return ;  }--d;//找最近的}
}int main()
{int T, a, b, c, d;cin >> T;while(T--){cin>>a>>b>>c>>d;bfs(a, b, c, d);}return 0;
}

转载于:https://www.cnblogs.com/ffgcc/p/10546452.html

UVa 10603 Fill (BFS+优先队列)相关推荐

  1. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  2. UVA 10603 - Fill(dijkstra + 状态图)

    题目链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  3. UVA 10603 Fill

    这道题其实是个隐形图(bfs),由开始状态往后面推就行了 #include<iostream> #include<cstdio> #include<algorithm&g ...

  4. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a,b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  5. hdu 1254(dfs+bfs+优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  6. nc15665 maze 题解 (传送门) 广搜bfs+优先队列

    maze:原题链接 题目描述: 小明来到一个由n x m个格子组成的迷宫 ,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱.小明所在的位置用'S'表示,目的地用'T'表示. 小 ...

  7. J - Fill (UVA - 10603)

    - 题目大意 有三个已知体积但不知刻度的杯子,前两个杯子中初始时没有水,第三个装满水,问是否可以倒出d升水,如果倒不出,则倒出一个最大的d',使得d'<=d,并且在这个过程中要求总倒水量最少. ...

  8. 倒水问题(Fill,UVA 10603) lrj白书 p202

    看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /*状态start到各个状态u1,u2,u3.....的倒水量分别为u1.dist,u2.dist,u3.dist....*//* ...

  9. pku 1724 ROADS BFS +优先队列

    http://poj.org/problem?id=1724 题意: Bob现在有的钱数为k,他想从城市1到城市n,给出m条连接两个城市的有向边,并且给出路的长度w,和经过这条路要交的钱数c.问Bob ...

最新文章

  1. css(面试第2天)用css绘制三角形
  2. Android studio中的NDK开发之NDK环境变量的配置(图文教程)
  3. CF997E. Good Subsegments(线段树,单调栈)
  4. socket编程介绍
  5. 基本linux命令vi,基本linux和vi命令.pdf
  6. core mysql 延迟加载_mybatis延迟加载及实例讲解
  7. carbondata 1.1.0安装文档
  8. Docker 私有仓库registry
  9. ktv管理系统_7天撸完KTV点歌系统,含后台管理系统(完整版)
  10. Windows Mobile 6 模拟器绿色中文版
  11. CentOS7.0系统安全加固实施方案
  12. 整理出Android逆向系列学习进阶视频,全网疯传
  13. office新建文件打开提示文件格式或扩展名无效
  14. skype安卓手机版_安卓手机版电视直播播放器
  15. 3.深入了解listen函数
  16. 令人头秃,SaaS部署和本地部署该怎么选?
  17. 计算视频的信息传输速率
  18. 青岛新媒体运营教程:三步浅谈活动运营,拆解策划实施
  19. 详解音视频直播中的低延时 1
  20. 云计算机房管理,云计算在机房管理中的应用前景研究

热门文章

  1. oracle 查询spid,查看数据库session的sid来查杀对应系统进程号spid
  2. oralce用存储过程实现分页 以及 用java调用这个存储过程的代码
  3. liferay form 小案例
  4. preparedStatement问号的深入理解
  5. c语言cobegin用法,用C语言实现P、V操作
  6. WAF机制及绕过方法总结:注入篇
  7. java动态加载jar文件并执行方法
  8. Linux下内存泄露工具
  9. notepad去除每行空格后面的所有的内容,并且获取每行最后一个字段的内容(就是删除每行的行首空格)...
  10. cmake的使用 cmake不是内部或外部命令