UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子、空的3升杯子和1升杯子,3个杯子中都没有刻度。不使用道具情况下,是否可量出4升水呢?

你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯子装满了c升水,其他两个杯子为空。最少需要倒多少升水才能让某一个杯子中的水有d升呢?如果无法做到恰好d升,就让某一个杯子里的水是d'升,其中d'<d并且尽量接近d。(1≤a,b,c,d≤200)。要求输出最少的倒水量和目标水量(d或者d')。
分析 : 紫书P202。


#include<bits/stdc++.h>
using namespace std;
+ ;
struct Node
{
], dist;
bool operator < (const Node & rhs) const{//Caution!
return dist > rhs.dist;
}
};
];//learn->有近似解的存在,所以使用ans来保存d或者<d升水转移的水量,并
//且全部赋值-1,答案的查找和数组的初值有点类似背包刚好装满时候的处理
int vis[maxn][maxn];
inline void initialize()
{
memset(ans, -, sizeof(ans));
memset(vis, , sizeof(vis));
}
inline void update_ans(Node &temp)
{
; i<; i++){
int Vol = temp.v[i];
|| ans[Vol] > temp.dist){//分别表示一开始和有更优解的情况
ans[Vol] = temp.dist;
}
}
}
inline void solve(int a, int b, int c, int d)
{
priority_queue<Node> pq;
Node Fir_node;
Fir_node.dist = ;
Fir_node.v[] = , Fir_node.v[] = , Fir_node.v[] = c;
pq.push(Fir_node);
vis[][] = ;
while(!pq.empty()){
Node u = pq.top();
pq.pop();
update_ans(u);
) break;
; i<; i++){
; j<; j++){
if(j!=i){
|| u.v[j]==cap[j]) continue;//此过程描述i倒向j,所以在i空或j满的情况下是无法做到的。模拟的代码应多考虑实际意义。
int Trans = min(cap[j], u.v[i]+u.v[j]) - u.v[j];//注意这里是min
Node New;
memcpy(&New, &u, sizeof(u));//*learn->结构体也可以这样赋值
New.v[i] -= Trans;
New.v[j] += Trans;
New.dist = u.dist + Trans;
]][New.v[]]){
pq.push(New);
vis[New.v[]][New.v[]] = ;
}
}
}
}
}
){
){
printf("%d %d\n", ans[d], d);
return ;
}
d--;
}
}
int main(void)
{
int nCase;
scanf("%d", &nCase);
while(nCase--){
int a, b, c, d;
initialize();
scanf("%d %d %d %d", &a, &b, &c, &d);
cap[] = a, cap[] = b, cap[] = c;
solve(a, b, c, d);
}
;
}
瞎 :
①类似的倒水问题,模拟倒水的操作可以参考刘汝佳的代码,简洁
; i<; i++){
; j<; j++){
if(j!=i){
|| u.v[j]==cap[j]) continue;///此过程描述i倒向j,所以在i空或j满的情况下是无法做到的。
int Trans = min(cap[j], u.v[i]+u.v[j]) - u.v[j];//*max -> min
Node New;
memcpy(&New, &u, sizeof(u));//*->learn
New.v[i] -= Trans;
New.v[j] += Trans;
New.dist = u.dist + Trans;
]][New.v[]]){
pq.push(New);
vis[New.v[]][New.v[]] = ;
}
}
}
}
倒水
②对于此类初始和结束都知道的,考虑存储状态进行广搜操作,注意状态的定义
③如果对于每一次状态转移的某一权值有要求,可以考虑使用结构体存储状态入队,然后根据某一需要的元素进行重载小于号,队列则使用优先队列
④这道题的广搜解答树明显有许多末端节点,所以应该全都去与暂存的答案比较,而不是一搜到答案就OK,而类似最短路的模型则是一搜到就推出,因为权值就是路径,第一个搜到的肯定是路径最短的,而此题很明显并不是转化成了最短路模型,如果是求倒水次数最少的话则是,现在求的是倒水量,所以在考虑将一道题进行状态转化然后进行搜索的时候,要区别答案是如何找出来的。
⑤对于搜索而言,状态很重要,对于现在这个局面,哪几个关键的信息能表示现在的状态,如何判重,答案如何存储和状态如何转移,都是决定能不能或者如何搜索的关键。
UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)的更多相关文章
- UVA 10603 - Fill BFS~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- UVA 658 状态压缩+隐式图+优先队列dijstla
不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...
- 【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)
这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...
- uva658(最短路径+隐式图+状态压缩)
题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
- UVa 10603 Fill [暴力枚举、路径搜索]
10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
随机推荐
- 【神经网络与深度学习】Caffe源码中各种依赖库的作用及简单使用
1. Boost库:它是一个可移植.跨平台,提供源代码的C++库,作为标准库的后备. 在Caffe中用到的Boost头文件包括: (1).shared_ptr.hpp:智能指针,使用它可以不 ...
- 匿名函数、委托和Lambda表达式
匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...
- 简述前后端分离的情况下,Vue实现点击图片下载到本地(并实现IE11浏览器的兼容)
1.简述 在前后端分离的项目中涉及跨域问题,通常都会使用token进行验证.最近在前后端分离的项目中在一个问题上搞了很久,就是以前下载附件或者导出数据为文件的时候,在以前的那些项目前端可以直接用 wi ...
- python 并发编程 IO模型介绍
gevent 底层是怎么实现? io模型4个重要概念: 两类 一类:同步.异步 提交任务的方式 同步: 提交完任务后,在原地等待结果,拿到结果后,才执行下一行代码 #所谓同步,就是在发出一个功能调用时 ...
- Linux c实现一个tcp文件服务器和客户端
总体需求:编写tcp文件服务器和客户端.客户端可以上传和下载文件. ================================================ 分解需求 客户端功能描述: 1)要 ...
- CSRF-DVWA_1.9-笔记
CSRF : Cross-site request forgery 跨站请求伪造 所用到的工具: Firefox浏览器及其插件 HackBar(快速构造URL) 和 T ...
- C语言Ⅰ作业12—学期总结
一.我学到的内容 二.我的收获 作业链接 收获 C语言Ⅰ博客作业01 认识了PTA编程,博客园,Markdown基本语法1,Markdown基本语法2 C语言Ⅰ博客作业02 PTA系统常见问题解答 C ...
- 零基础学习前端1-1配置node及npm环境变量
零基础学习前端1-1配置node及npm环境变量 ## 1-1配置node及npm环境变量 首先:下载node 可以直接去官方网站下载 1.首先从官网下载安装包 https://nodejs.org/ ...
- MFC,QT与WinForm,WPF简介
编程语言的组成编程语言做为一种语言自然和英语这些自然语言有类似的地方.学英语时我们知道要先记26个字母,然后单词及其发音,接下来就是词组,句子.反正简单的说就是记单词,熟悉词法,句法.接下来就是应用了 ...
- 洛谷 P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题解
题面 这道题是一道标准的01分数规划: 但是有一些细节可以优化: 不难想到要二分一个mid然后判定图上是否存在一个环S,该环是否满足∑i=1t(Fun[vi]−mid∗Tim[ei])>0 但是 ...