看着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的更多相关文章

  1. 倒水问题(Fill, UVa 10603)

    [题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...

  2. Uva 548 二叉树的递归遍历lrj 白书p155

    直接上代码... (另外也可以在递归的时候统计最优解,不过程序稍微复杂一点) #include <iostream> #include <string> #include &l ...

  3. Uva 122 树的层次遍历 Trees on the level lrj白书 p149

    是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...

  4. 矩阵连乘 LRJ白书 p141 栈 解析表达式

    #include<iostream> #include<cstdio> #include<cstring> #include<sstream> #inc ...

  5. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  6. 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 ...

  7. 白书P61 - 点集配对问题

    白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...

  8. 白书P60 - 硬币问题

    白书P60 - 硬币问题 完全背包.DP #include <iostream> #include <cstdio> #include <cstring> usin ...

  9. poj2991 Crane(线段树+集合)白书例题

    题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...

随机推荐

  1. 【Python3之面向对象进阶】

    一.isinstance和issubclass 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj=Foo() p ...

  2. 实现简易版的moment.js

    github源码地址: www.baidu.com 作者: 易怜白 项目中使用了时间日期的处理方法,只使用了部分方法,为了不在引入第三方的库(moment.js),这里自己封装了项目中使用到的方法. ...

  3. SevenZipSharp的入门教程(包含如何加密压缩,解密压缩)

    (一)为什么选择7z              7z 是一种主流高效的压缩格式,它拥有极高的压缩比.在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式.该格式最初被7-Zip实现并采 ...

  4. 【Android Developers Training】 9. 覆盖于布局之上的Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. USACO The Castle

    首先看一下题目. The CastleIOI'94 - Day 1 In a stroke of luck almost beyond imagination, Farmer John was sen ...

  6. flex sqlite基本用法

    flex sqlite基本用法 页面 <?xml version="1.0" encoding="utf-8"?> <s:WindowedAp ...

  7. vue-roter2 路由传参

    本文主要介绍通过vue-router2路由中传参的方法,项目为vue-cli搭建项目 1.路由配置 首先在路由配置处(router/index.js), 在path后面通过:+参数名来指定参数名 需要 ...

  8. for(int a:i)在java 编程中的使用

    这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简化版本 ...

  9. Unity3D调用摄像头

    代码启用摄像头 .using UnityEngine;   .using System.Collections;   .   .public class WebCamManager : MonoBeh ...

  10. 使用ajax方法实现form表单的提交(附源码)

    写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说 ...