题意给出3个杯子,只有最后一个杯子装满水,问至少倒多少水才能使其中一个杯子里的水达到d升。

分析:这题关键在于优先级队列,每次都要取倒水量最小的状态出来。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<queue>
using namespace std;
struct Node {int v[3], dist;bool operator<(const Node& u) const{return dist > u.dist;}
};
const int maxn = 200 + 5;
int vis[maxn][maxn], cap[3], ans[maxn];
void bfs(int a, int b, int c, int d) {priority_queue<Node>q;//优先级队列memset(vis, 0, sizeof(vis));memset(ans, -1, sizeof(ans));cap[0] = a, cap[1] = b, cap[2] = c;Node start;start.dist = 0;start.v[0] = 0; start.v[1] = 0; start.v[2] = c;q.push(start);vis[0][0] = 1;while (!q.empty()) {Node u = q.top(); q.pop();for (int i = 0; i < 3; i++) {int d = u.v[i];if (ans[d]<0 || ans[d]>u.dist)ans[d] = u.dist;//更新每个杯子水的状态信息}if (ans[d] >= 0)break;//有目标状态信息,退出for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (u.v[i] == 0 || u.v[j] == cap[j])continue;//杯子满了或者空了int amount = min(cap[j], u.v[j] + u.v[i]) - u.v[j];//加水量最小Node u2;memcpy(&u2, &u, sizeof(u));u2.dist = u.dist + amount;//u2的倒水量u2.v[i] -= amount;u2.v[j] += amount;if (!vis[u2.v[0]][u2.v[1]]) {vis[u2.v[0]][u2.v[1]] = 1;q.push(u2);}}}}while (d >= 0) {if (ans[d] >= 0) {printf("%d %d\n",ans[d], d);return;}d--;}
}
int main() {int kase,a,b,c,d;cin >> kase;while (kase-- > 0) {cin >> a >> b >> c >> d;bfs(a, b, c, d);}//system("pause");return 0;
}

UVA10603 倒水问题相关推荐

  1. H - Pots POJ - 3414(两个锅互相倒水)

    H - Pots POJ - 3414 题意: (两个锅互相倒水)希望能通过题目中的几种操作使一个锅中的水量为目标水量 bfs 搜索每一步的每种操作,直到所有操作用完,则impossible,否则输出 ...

  2. 倒水问题(Java)

    有两个杯子,一个杯子容量为3,另一个容量为5.  怎么倒水才能得到体积为4的水. 可以给一个杯子加满水.或倒光.或把一个杯子的水加到另一个杯子中. 1 import java.util.ArrayLi ...

  3. c++ 宽搜(倒水)

    题目描述 有一个很大的水缸和二个容量分别为X和Y的水壶,按照以下的规则倒水,问最少经几次倒水后,可得到Z升水 规则1:水缸向水壶1倒水,将水壶1装满: 规则2:水缸向水壶2倒水,将水壶2装满: 规则3 ...

  4. 三个容器倒水_绿茶“最忌讳”先放茶叶再倒水,想要茶味香浓,记住正确泡茶法...

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到内容了.每天都有分享.完全是免费订阅,请放心关注懂茶的人都知道,绿茶对于水温是有要求的.但是很多茶友在 ...

  5. P1582 倒水(二进制)

    https://www.luogu.org/problemnew/show/P1582 P1582 倒水 评测方式 云端评测 标签 难度 普及+/提高 时空限制 1000ms / 128MB 提示:收 ...

  6. 【codevs1226】倒水问题,BFS练习

    1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x ...

  7. 安全是什么意思_进衡水火车站要转着圈找门!这是什么意思……清扫车路边倒水 既浪费又不安全...

    "前段时间出门,火车站广场南口还是开放的,为什么现在给封死了呢?""进火车站要转着圈找门,这是什么意思?"--近日,不断有市民向本报反映,称衡水火车站广场南口& ...

  8. 两个水壶相互倒水—水壶问题

    点击此处快速跳到程序部分 水壶问题 有两个容量分别为 x升 和 y升 的水壶以及无限多的水.请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? 如果可以,最后请用以上水壶中的一或两个来盛放取 ...

  9. USACO 1.4 Mother's Milk 母亲的牛奶(经典的dfs倒水问题)

    [USACO1.4.4]Mother's Milk 母亲的牛奶 Time Limit:10000MS  Memory Limit:65536K Total Submit:42 Accepted:27  ...

最新文章

  1. 重庆社区计算机考试题库,2020重庆社区工作者考试题库:模拟题100题(64)
  2. CSS 相对|绝对(relative/absolute)定位系列(一)
  3. RHEL7 下双网卡绑定做主备(冗余)
  4. 创建指向以下位置中的matlab脚本的符号链接_【分享吧】浅析软链接与硬链接
  5. SQLite中的内连接简化技巧
  6. 赠书:Redis 深度历险:核心原理与应用实践
  7. hyper-V 检查点
  8. Item category dropdown list的determine - filtering 逻辑
  9. 三年租男友回家竟花了10万......
  10. 在SQL Server2005中进行错误捕捉
  11. python beautifulsoup4_Python之Beautiful Soup 4使用实例
  12. Unity5.1 新的网络引擎UNET(十五) Networking 引用--下
  13. Xlua中的util脚本中的async_to_sync方法 记录
  14. amazon 设计 4 vending machine
  15. The Distribution File System
  16. Linux知识积累(2)dirname的使用方法
  17. 个人简单版租房合同范本电子版Word模板免费下载样板
  18. Cookie、Session的使用及区别
  19. MYSQL统一社会信用代码校验函数
  20. MySQL order by、desc、limt的使用

热门文章

  1. 查看网卡[网络接口]
  2. wait/notify的基本使用
  3. springboot属性注入
  4. 【面向过程编程】零钱通项目
  5. php实现享元模式,php设计模式 flyweight (享元模式)
  6. 3. Longest Substring Without Repeating Characters无重复字符的最长子串
  7. Linux下区分物理CPU、逻辑CPU和CPU核数
  8. 一段话系列-领域模型是什么?
  9. ubuntu双系统把win7设置为默认启动选项
  10. 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求