UVa 10603 倒水问题
https://vjudge.net/problem/UVA-10603
题意:三个杯子,倒水问题。找出最少倒水量。
思路:路径寻找问题。不难,暴力枚举。
#include<iostream>
#include<queue>
#include<string>
#include<cstring>
using namespace std; int a, b, c, d;
int vis[][]; //访问变量,因为只有三个杯子,所以记录前两个杯子的状态即可
int cap[];
int ans[]; struct Node
{
int v[], dist;
bool operator <(const Node& rhs) const //重载小于号
{
return dist>rhs.dist;
}
}; void update(Node u) //每次有新状态时,记录形成d升水时需要的最少倒水量
{
for (int i = ; i < ; i++)
{
int x = u.v[i];
if (ans[x] < || u.dist < ans[x]) ans[x] = u.dist;
}
} void bfs()
{
cap[] = a, cap[] = b, cap[] = c; //记录三个杯子的容量
memset(vis, , sizeof(vis));
memset(ans, -, sizeof(ans));
priority_queue<Node> q;
Node start;
start.v[] = ; start.v[] = ; start.v[] = c; start.dist = ;
q.push(start);
vis[][] = ; //设置初始状态为已访问
while (!q.empty())
{
Node p = q.top();
q.pop(); update(p);
if (ans[d] >= ) break; //找到目标状态,退出循环 for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{ if (i != j && p.v[i]!= && p.v[j]<cap[j]) //不能给自己倒水并且第i个杯子有水和第j个杯子未满
{
Node u=p; //建立新状态
int r = cap[j] - p.v[j]; //计算第j个杯子空余水量
if (p.v[i] >= r) //如果第i个杯子水量充足
{
u.dist = p.dist + r; //更新后的倒水量
u.v[j] = p.v[j] + r; //更新后第j个杯子水量
u.v[i] = p.v[i] - r; //更新后第i个杯子水量
}
else //如果第i个杯子水量不足
{
u.dist = p.dist + p.v[i];
u.v[j] = p.v[j] + p.v[i];
u.v[i] = ;
}
if(!vis[u.v[]][u.v[]]) //如果该状态没出现过
{
vis[u.v[]][u.v[]] = ;
q.push(u);
}
} }
} } while (d >= )
{
if (ans[d] >= )
{
cout << ans[d] << " " << d << endl;
return;
}
d--; //如果无法做到d升,则检验d--,找到最接近d升
}
} int main()
{
//freopen("D:\\txt.txt","r", stdin);
int n;
cin >> n;
while (n--)
{
cin >> a >> b >> c >> d;
bfs();
}
return ;
}
UVa 10603 倒水问题的更多相关文章
- 倒水问题(Fill, UVa 10603)
[题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...
- 倒水问题UVA 10603——隐式图&&Dijkstra
题目 给你三个容量分别为 $a,b,c$ 的杯子,最初只有第3个杯子装满了水,其他两个杯子为空.最少需要到多少水才能让一个某个杯子中的水有 $d$ 升呢?如果无法做到恰好 $d$ 升,就让某个杯子里的 ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 倒水问题(Fill,UVA 10603) lrj白书 p202
看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /* 状态start到各个状态u1,u2,u3..... 的倒水量分别为u1.dist,u2.dist,u3.dist.... * ...
- UVA 10603 - Fill BFS~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...
- UVA 10603 Fill
题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...
- UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)
题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...
- UVa 10603 Fill (暴力BFS+优先队列)
题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
随机推荐
- 最大流(EK)
最大流 — Edmond Karp算法 Edmond Karp算法的大概思想: 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束. 在寻找 ...
- php中&运算符的理解与使用
php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的名字访问同一个变量内容. 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 例一: < ...
- .NET 互联网技术简介
概述 技术更新太快,尤其是在互联网公司里,很多新的主流技术,我们还是必须要知道和熟练使用的.下面就给大家简单介绍,入门还是需要大家更努力的去深入学习. 目录 Git 入门 常用软件安装及VS插件工具 ...
- 把 ElasticSearch 当成是 NoSQL 数据库
Elasticsearch 可以被当成一个 “NoSQL”-数据库来使用么? NoSQL 意味着在不同的环境下存在不同的东西, 而erestingly 它并不是真的跟 SQL 有啥关系. 我们开始只会 ...
- promise-async-await
通常而言,这3个关键字 都是用来「优雅」的处理ajax异步请求的 //es6的时候promise诞生,很好的解决了嵌套回调地狱,改良方案为链式回调. // es2017的时候诞生了async.awai ...
- sql性能优化(摘自网络)
索引,索引!!!为经常查询的字段建索引!! 但也不能过多地建索引.insert和delete等改变表记录的操作会导致索引重排,增加数据库负担. 优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶 ...
- SpringBoot之集成WebSocket
websocket是什么不做介绍.开发环境:jdk1.8,win7_64旗舰版,idea 1.初始化一个springboot项目 2.加入websocket依赖 <!-- springb ...
- java copy 文件夹
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...
- linux环境下安装jdk1.6
卸载rpm版的jdk: #rpm -qa|grep jdk 显示:jdk1.6.0_29-fcs 卸载:#rpm -e --nodeps jdk1.6.0_29-fcs 1.从sun公司网站www.s ...
- [转] Oracle学习之创建数据库(新建实例)
由于项目需求,在本机中开发,需要新建oracle数据库实例,亲测可以. 出处:http://blog.csdn.NET/luiseradl/article/details/6972217 http:/ ...