倒水问题(Fill,UVA 10603) lrj白书 p202
看着lrj的代码自己敲了一遍,还没调试成功。。。。
有时间再进行完善
/*
状态start到各个状态u1,u2,u3.....
的倒水量分别为u1.dist,u2.dist,u3.dist....
*/
/*
按倒水量递增的顺序去寻找当前状态的v[0],v[1],v[2]是否为d
但是程序实现的时候我们寻找目标水量是根据 ans[d]>0,而不是对每一个状态的v[]进行遍历
为什么这样做呢?当然是因为麻烦,ans[d]>0很直接地说明了v[]有三者之一为d
*/
#include <cstdio>
#include <cstring>
#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 update_ans(const Node &u){
for (int i=0;i<3;i++){
int d=u.v[i];
if(ans[d]<0||u.dist<ans[d]) ans[d]=u.dist;//每次有新的状态时,记录形成d升水所需要的最小倒水量
}
}
void solve(int a,int b,int c,int d){
cap[0]=a;
cap[1]=b;
cap[2]=c;
memset(vis,0,sizeof(vis));//vis[]记录三元组状态是否重复
memset(ans,-1,sizeof(ans));//ans[]记录当前的最小倒水量
priority_queue<Node> q; Node start;
start.dist=0;//总的倒水量
start.v[0]=0;start.v[1]=0;start.v[2]=c;
q.push(start);//准备工作 vis[0][0]=1;//设置初始状态为已访问
/*!当所有状态都被访问完,就算ans[d]<0,while{}也停止
!!当ans[d]>0,表示输出所求的状态已找到,停止循环*/
while (!q.empty()){
Node u=q.top();q.pop();//对优先队列表头(即当前队列结点.dist最小)的结点进行访问
update_ans(u);
if (ans[d]>=0) break;
//从v[i]--v[j]加水,加多少水呢?只要能加,就加到不能加为止
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)if(i!=j){
if(u.v[i]==0||u.v[j]==cap[j]) continue; //过渡到下一个i或下一个j
int amount=min(cap[j],u.v[i])-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[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 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 0;
}
倒水问题(Fill,UVA 10603) lrj白书 p202的更多相关文章
- 倒水问题(Fill, UVa 10603)
[题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...
- Uva 548 二叉树的递归遍历lrj 白书p155
直接上代码... (另外也可以在递归的时候统计最优解,不过程序稍微复杂一点) #include <iostream> #include <string> #include &l ...
- Uva 122 树的层次遍历 Trees on the level lrj白书 p149
是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...
- 矩阵连乘 LRJ白书 p141 栈 解析表达式
#include<iostream> #include<cstdio> #include<cstring> #include<sstream> #inc ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- UVA大模拟代码(白书训练计划1)UVA 401,10010,10361,537,409,10878,10815,644,10115,424,10106,465,10494
白书一:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=64609#overview 注意UVA没有PE之类的,如果PE了显示WA. UVA ...
- 白书P61 - 点集配对问题
白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...
- 白书P60 - 硬币问题
白书P60 - 硬币问题 完全背包.DP #include <iostream> #include <cstdio> #include <cstring> usin ...
- poj2991 Crane(线段树+集合)白书例题
题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...
随机推荐
- SQL 调用存储过程
--1调用存储过程 exec 存储过程名 参数 --2当表使用 select a.*,b.* from tb b inner join ( select * from openrowset('sqlo ...
- JavaScript浮点运算的问题 (乘法)
<script type="text/javascript"> var get_b_val_final=accMul(get_b_val,100)+"%&qu ...
- 发布.NET MVC网站 到Azure
最近的项目部署在Microsoft Azure,学习了一些新东西,记录下. 1.账号. 用于登录portal(https://portal.azure.cn/),账号下有对应的Subscription ...
- Spring Boot1.5.4 连接池 和 事务
原文:https://github.com/x113773/testall/issues/10 默认连接池---spring Boot中默认支持的连接池有Tomcat.HikariCP .DBCP . ...
- 使用Ansible进行项目的自动部署(Tomcat、Weblogic)
原文:https://github.com/x113773/testall/issues/4 问题:Weblogic/Tomcat 通过JAVA直接远程调用或者调用本地Shell还是通过Ansible ...
- 【Android Developers Training】 10. 序言:支持不同设备
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 21. 创建一个可变动的UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Thrift总结(二)创建RPC服务
前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口.不清楚的可以看这个<Thrift总结(一)介绍>.做好之前的准备工作以后,下面就开始如何 ...
- SQL联表查询
数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...
- encodeURI与decodeURI
Global对象的ecodeURI方法可以对URI进行编码,与其类似的还有一个方法encodeURIComponent方法. 相应的对URI的解码方法也有两个:decodeURI.decodeURIC ...