题目

给你三个容量分别为 $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的更多相关文章

  1. 倒水问题 (FillUVa 10603) 隐式图

    题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...

  2. UVA 658 状态压缩+隐式图+优先队列dijstla

    不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...

  3. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  4. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

  5. nyoj 21--三个水杯(隐式图bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...

  6. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  7. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

  8. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  9. Ural 1741 Communication Fiend(隐式图+虚拟节点最短路)

    1741. Communication Fiend Time limit: 1.0 second Memory limit: 64 MB Kolya has returned from a summe ...

随机推荐

  1. LeetCode 32. 最长有效括号(Longest Valid Parentheses) 31

    32. 最长有效括号 32. Longest Valid Parentheses 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 每日一算法2019/6/ ...

  2. SpringBoot配置文件敏感信息加密-jasypt

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...

  3. CSS中position和float的使用

    近期会更新一系列博客,对基础知识再度做个巩固和梳理. 一.position定位 (一):position的属性 1.absolute:生成绝对定位的元素,相对于最近一级定位不是static的父元素来进 ...

  4. Ubuntu 中linux 编译错误的(-)

    1.错误 compress.c:14:58: fatal error: zlib.h: No such file or directorycompilation terminated. 解决:sudo ...

  5. if的条件表达式

    常用的: [ -a FILE ] 如果 FILE 存在则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真. [ -e FILE ] 如果 指定的文件或目录存在时返回为真. [ ...

  6. spring boot + vue实现图片上传及展示

    转载:https://blog.csdn.net/weixin_40337982/article/details/84031778 其中一部分对我很有帮助 转载记录下 首先,html页面: <! ...

  7. 一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能

    1.开篇 大学毕业工作已经两年了,上学那会就很想研读一份开源GIS的源码,苦于自己知识和理解有限,而市面上也没有什么由浅入深讲解开源gis原理的书籍,大多都是开源项目简介以及项目的简单应用.对于初级程 ...

  8. 文件流CopyTo

  9. C# HtmlAgilityPack爬取静态页面

    最近对爬虫很感兴趣,稍微研究了一下,利用HtmlAgilityPack制作了一个十分简单的爬虫,这个简易爬虫只能获取静态页面的Html HtmlAgilityPack简介 HtmlAgilityPac ...

  10. sql 注入风险

    目录 sql 注入风险 什么是sql注入呢? 查看sql注入风险 如何避免 sql 注入风险 pymysql 简单规避注入风险示列 sql 注入风险 什么是sql注入呢? 参考百度 查看sql注入风险 ...