倒水问题UVA 10603——隐式图&&Dijkstra
题目
给你三个容量分别为 $a,b,c$ 的杯子,最初只有第3个杯子装满了水,其他两个杯子为空。最少需要到多少水才能让一个某个杯子中的水有 $d$ 升呢?如果无法做到恰好 $d$ 升,就让某个杯子里的水是 ${d}'$ 升,其中 ${d}' < d$ 并且尽量接近 $d$。($1 \leq a,b,c,d \leq 200$)
分析
设第一个杯子有 $v_0$ 升水、第二个杯子有 $v_1$ 升水、第三个杯子有 $v_2$ 升水,称这为一个状态 $((v_0, v_1, v_2))$,而从一个杯子向另一个杯子倒水则扩展出下一个状态,设倒水量为两个状态间的距离。类似于Dijkstra,因此能保证每次从队列中弹出的都是距离最小的,每次都更新一下答案。
由于总水量是不变的,也就是说 $v_0, v_1$ 确定时,$v_2$ 也随之确定,所以实际状态数为 $200^2$.
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; struct Node {
int v[], dist;
bool operator < (const Node& rhs) const {
return dist > rhs.dist;
}
}; const int maxn = + ;
int mark[maxn][maxn], dist[maxn][maxn], cap[], ans[maxn]; void update_ans(const Node& u) {
for(int i = ; i < ; i++) {
int d = u.v[i];
if(ans[d] < || u.dist < ans[d]) ans[d] = u.dist;
}
} void solve(int a, int b, int c, int d) {
cap[] = a; cap[] = b; cap[] = c;
memset(ans, -, sizeof(ans));
memset(mark, , sizeof(mark));
memset(dist, -, sizeof(dist));
priority_queue<Node> q; Node start;
start.dist = ;
start.v[] = ; start.v[] = ; start.v[] = c;
q.push(start); dist[][] = ;
while(!q.empty()) {
Node u = q.top(); q.pop();
if(mark[u.v[]][u.v[]]) continue;
mark[u.v[]][u.v[]] = ;
update_ans(u);
if(ans[d] >= ) break;
for(int i = ; i < ; i++)
for(int j = ; j < ; j++) if(i != j) {
if(u.v[i] == || u.v[j] == cap[j]) continue;
int amount = min(cap[j], u.v[i] + u.v[j]) - u.v[j];
Node u2=u;
u2.dist = u.dist + amount; //换成+1,就是求最少次数
u2.v[i] -= amount;
u2.v[j] += amount;
int& D = dist[u2.v[]][u2.v[]];
if(D < || u2.dist < D){
D = u2.dist;
q.push(u2);
}
}
}
while(d >= ) {
if(ans[d] >= ) {
printf("%d %d\n", ans[d], d);
return;
}
d--;
}
} int main() {
int T, a, b, c, d;
scanf("%d", &T);
while(T--) {
scanf("%d%d%d%d", &a, &b, &c, &d);
solve(a, b, c, d);
}
return ;
}
倒水问题UVA 10603——隐式图&&Dijkstra的更多相关文章
- 倒水问题 (FillUVa 10603) 隐式图
题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...
- 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 ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)
1741. Communication Fiend Time limit: 1.0 second Memory limit: 64 MB Kolya has returned from a summe ...
随机推荐
- docker容器中用户自定bridge网络与默认bridge网络之间的区别
转载 https://blog.csdn.net/dkfajsldfsdfsd/article/details/79959534
- 编写第一个Linux环境下程序的编译,下载记录
跟着韦东山学习Linux: 今天系统系统性的学了代码的编译下载,条记录一下: 一,代码:001_led_on.S,就把下面代码编译后Bin文件下载进2440处理器. /* * 点亮LED1: gpf4 ...
- AS3中 is,as,typeof的区别
AS3中 is,as,typeof的区别 . var my_num:Number=9;trace(typeof my_num);var my_object:Array=["语文", ...
- jwt 0.9.0(一)推荐jwt理由
本人一直有良好的写技术博文的习惯,最近研究 jwt 有点点心得,赶紧记下来. 我推荐使用jwt(Json Web Token)这种客户端存储状态方式,代替传统的服务端存储状态方式(比如redis存储s ...
- 单例DCL模式
单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 一般写法 public class DCLSingle { public static DCLSingle instance= n ...
- 集成maven和Spring boot的profile
如果在配置中勾选了多套配置,则以pom.xml文件中 profiles中 配置 最后一个配置为准. maven中配置profile节点: <project> .... <profi ...
- java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver 错误解决
1.今天在搭建SpringBoot整合 pageHelper的时候报错如下 1.1 引入依赖如下: <!-- 分页插件 --> <dependency> <groupId ...
- 使用Identity Server 4建立Authorization Server
使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端 摘要: 预备知识: http://www.cnblogs.com/cg ...
- node.js开发 npm包管理工具
npm介绍 说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) 使用npm安装插件:命令提示符执行npm instal ...
- javascript高级程序设计阅读总结
5章 引用类型 1.object类型 创建 1.var obj ={} ---对象字面量 2.var obj = new Object(); ---new操作符 2.Array类型 创建 1.var ...