题目链接


https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544

题目大意


有三个水杯,容量分别为 a, b, c 刚开始 c 水杯注满水,其他是空的,然后求经过 n 次操作后可不可以得到 d 升水。如果可以的话,转移的水量尽量少,如果无法得到 d 升的话,就输出 d’ 升,d’< d 并且 d’ 尽量的大。

这里的转移水量指,总共转移了多少升水,比如 a 向 b 注了五升水,那么转移水量为五升。

解题过程


照着紫书示例敲得,看作者代码学到了好多东西。

题目分析


  • 首先是进行枚举操作的时候,虽然总共三个杯子,作者还是把数据放到了数组里面,简化不少代码,如果是我的话,就直接写9个if了。

  • 然后是代码的思想是 dijkstra,求最短路。

    • 把整个问题当做一个状态图,每个点由三个水杯里面的水确定。
    • 两个点之间的边的权值,是由两个状态转化所需要转移的水量。(注意一点是这里是有向图)
    • 另外三个水杯里面的水合不变,给定两个水杯里水的体积,就可以确定另一个,所以储存状态时,只需要记录两个水杯的体积即可。
  • 经过上面的解析,这个问题就抽象成了,求一个有向图的最短路径,然后使用了优先队列优化的 dijkstra 。

  • 另外memcpy的使用值得一学,使用方法如下:
    memset(&a, &b, sizeof(a));
    把 b 复制给a,直接复制的内存,效率比直接循环快。

AC代码


#include<bits/stdc++.h>
using namespace std;const int MAX = 200+10;struct Node
{int v[3], dist;
};bool operator < (const struct Node& a, const struct Node& b)
{return a.dist > b.dist;
}int vis[MAX][MAX], ans[MAX];void update_ans(Node u)
{for (int i = 0; i < 3; i++){int d = u.v[i];if (ans[d] < 0 || ans[d] > u.dist)ans[d] = u.dist;}
}void solve(int a, int b, int c, int d)
{int cap[3] = {a,b,c};memset(vis, 0, sizeof(vis));memset(ans, -1, sizeof(ans));Node start;start.v[0] = 0, start.v[1] = 0, start.v[2] = c;start.dist = 0;priority_queue<Node> q;q.push(start);vis[0][0] = 1;while (!q.empty()){Node u = q.top(); q.pop();update_ans(u);if (ans[d] >= 0)break;for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){if (i == j)continue;if (u.v[i] == 0 || u.v[j] == cap[j])continue;int amount = min(cap[j], u.v[i] + u.v[j]) - u.v[j];Node u2;memcpy(&u2, &u, sizeof(u));u2.dist = u.dist + amount;u2.v[i] -= amount;u2.v[j] += amount;if (!vis[u2.v[1]][u2.v[0]]){vis[u2.v[1]][u2.v[0]] = 1;q.push(u2);}}}}
}int main()
{int T;scanf("%d", &T);while (T--){int a, b, c, d;scanf("%d %d %d %d", &a, &b, &c, &d);solve(a, b, c, d);while (d >= 0){if (ans[d] >= 0){printf("%d %d\n", ans[d], d);break;}d--;}}
}

转载于:https://www.cnblogs.com/ACMFish/p/7222860.html

UVA 10603 - Fill(dijkstra + 状态图)相关推荐

  1. UVA 10603 Fill

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

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

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

  3. UVa 10603 Fill (BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻,某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和dd ...

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

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

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

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

  6. J - Fill (UVA - 10603)

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

  7. UVa 11520 Fill the Square 填充正方形

    在一个 n * n 网格中填了一些大写字母,你的任务是把剩下的格子中也填满大写字母,使得任意两个相邻格子(即有公共边的格子)中的字母不同.如果有多重填法,则要求按照从上到下,从左到右的顺序把所有格子连 ...

  8. UVa 10603 - Fille

    題目:倒水問題,有已知容量的三個杯子,前兩個是空的最後的是滿的. 每次可以將一杯水倒向另一杯,只可能是全部倒進去,或者被倒的杯子滿了. 求到達目標,最小的移動水量,如果沒有目標求出不超過的最大值. 分 ...

  9. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

最新文章

  1. 漫画:据说很多搞软件的羡慕硬件工程师
  2. 基于Smiles2vec预测化合物物理性质
  3. 陕西打造12项精品体育赛事 加快建设体育强省
  4. 网络安全系列之五十 对Web主目录进行备份
  5. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )
  6. Golang新开发者要注意的陷阱和常见错误
  7. python取当前时间前后一定间隔的时间点
  8. smartupload 路径不存在_洞悉复杂金融场景,覆盖完备测试路径
  9. 查找算法——折半查找(JAVA)
  10. 产品经理必懂技术术语(前端类)
  11. webx学习(二)——Webx Framework
  12. html图片居中在页面中心点,css让img居中显示 怎么让一张图片在网页中居中显示...
  13. 不用安装Excel使用PSExcel自动处理Excel文件
  14. 长三角政务服务“一网通办” 公积金提取 `网签合同编号`如何获取?
  15. python打开桌面文件_python整理桌面文件
  16. 星速配资:能耗双控双刃剑 造纸板块一飞冲天
  17. 忆享聚焦|全球云计算市场份额、数字虚拟人、“元宇宙”实体店……近期行业热点速览
  18. yolov5s-5.0网络模型结构图
  19. 这几款小众软件,电脑常备
  20. pandas中如何提取DataFrame的某些列

热门文章

  1. plsql 无法解析指定的连接标识符_Java方法加载、解析、存储、调用
  2. 爬虫的步骤解析内容xpath介绍_爬虫入门到精通-网页的解析(xpath)
  3. jvm学习笔记(二)
  4. ttf能改成gfont吗_如何编辑ttf字体文件
  5. 天线3db波束宽度_天线波束宽度计算公式
  6. java怎么捕捉除数异常_Java异常的捕获及处理---小总结
  7. 查看git安装目录_一、Linux和Windows下安装Git
  8. python数据生成正态分布图_Python 与金融数据生成机器学习的特征数据
  9. Elasticsearch Java Client 版本区别及起步(5.X 和6.X)
  10. dython:Python数据建模宝藏库