题目

给你三个容量分别为 $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. MySQL8.0.16 单机 Linux安装以及使用

    安装 先去下载 https://dev.mysql.com/downloads/mysql/ 然后上传到Linux 进入存放目录,解压到指定目录[我这里是/soft/mysql8] [root@loc ...

  2. 【转帖】MIPS构架之:我和龙芯有个约会

    MIPS构架之:我和龙芯有个约会 https://www.eefocus.com/mcu-dsp/364490 <处理器史话>之十二 2016-06-24 12:21 作者:付丽华预计 1 ...

  3. Mysql中MVCC的使用及原理详解

      准备 测试环境:Mysql 5.7.20-log 数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为test ...

  4. Spring Boot之从Spring Framework装配掌握SpringBoot自动装配

    Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...

  5. AttributeError: module 'select' has no attribute 'epoll'

    AttributeError: module 'select' has no attribute 'epoll'   今天乌班图镜像莫名其妙损坏了,只好用Windows写并发TCP服务器的代码.运行后 ...

  6. springboot打成jar包后无法解压

    springboot打成jar包后无法解压 Springboot打出来的jar,用压缩工具解压报错.Why? 先说解决办法. 1.解决办法 executable属性导致的,属性改成false后重新打包 ...

  7. ADO.NET 八(一个例子)

    可视化方式绑定 DataGridView 控件(写的不详细,结合上一篇) 使用可视化数据绑定方式可以快速完成将数据表中的数据显示在 DataGridView 控件中的操作,并可以很容易地对绑定列的属性 ...

  8. 那些年,Linus torvalds大神喷过的技术

    Linus Torvalds 被认为是最伟大的程序员之一,因为他写出了使用最广泛的软件,如 Linux 内核和 Git 版本控制系统.但是他这个人经常因为讲话带有情绪,甚至是因为带有脏话的意见而饱受非 ...

  9. js --装饰者模式

    定义 装饰者模式能够在补改变对象自身的基础上,在程序运行期间给对象动态的添加职责. 当看到装饰者模式的定义的时候,我们想到的js 的三大特性之一--继承,不也能够实现不改变对象自身的基础上,添加动态的 ...

  10. JavaScript之变量提升

    变量提升:在JavaScript中,页面加载时,会将用var声明的变量提升到作用域的最前端,只能提升声明,不能提升赋值 如果变量先赋值再使用,可以省略关键字var 如果先使用变量,再赋值,不可以省略关 ...