题目PDF:https://uva.onlinejudge.org/external/106/10603.pdf

judge地址:https://vjudge.net/problem/UVA-10603

(紫书上的题目P203)

题目大意:


解题思路:


对于每个杯子,它可以向另外两个杯子(选择其中一个)倒一定数量的水:min(把自己当前的水全部倒完,只倒另一个杯子所需的那部分水),故两层for遍历。

用一个三元组(v0,v1,v2)表示三个杯子的水量即一个状态,因为总水量一定,所以对于两个状态,若v0=v0‘ 且v1=v1’,那么v2=v2‘,所以需要剪枝,做个标记,避免出现死循环。

将状态和达到这个状态所需要的倒水量绑定,对于某个状态下每个杯子的水量w,用ans[w]存这个杯子要达到水量w所对应的最小倒水量,并不断更新这个值。

因为要找到最小的倒水量,所以要把这些状态(和绑定的最小倒水量)存入优先队列中,倒水量小的优先,这样就可以尽快找到ans[d]对应的最小倒水量,一旦找到就输出。如果没有找到ans[d],那么ans[d-1],ans[d-2]...and[0]依次只要在广搜结束后找到了对应的最小倒水量就输出,结束程序,即为答案。

其实这道题如果思路清晰的话,还是很好写的。

ac代码:


#include <iostream>
#include <algorithm>
#include <string.h>
#include <ctype.h>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <fstream>
#define  maxn 650
#define lowbit(x) (x&(-x))
typedef long long ll;
const ll mod=1e9+7;
using namespace std;
struct node//每一种状态
{int outw;int v[3];friend bool operator <(node a,node b){return a.outw>b.outw;//倒出水量少的优先}
};
int ans[maxn],vis[maxn][maxn],maxv[3];
void solve(int a,int b,int c,int d)
{memset(ans,-1,sizeof(ans));//当ans[i]>=0时,表示已经i这个目标水量已经达到过memset(vis,0,sizeof(vis));priority_queue<node> q;maxv[0]=a;maxv[1]=b;maxv[2]=c;node x;x.outw=0;x.v[0]=0;x.v[1]=0;x.v[2]=c;//初始状态vis[0][0]=1;q.push(x);while(!q.empty()){node u=q.top();q.pop();//更新目标水量对应的最少倒水量for(int i=0;i<=2;i++){int w=u.v[i];if(ans[w]<0 || u.outw<ans[w]) ans[w]=u.outw;}if(ans[d]>=0) break;//得到结果//从i容器向j容器倒amount的水量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]==maxv[j]) continue;int amount=min(u.v[i],maxv[j]-u.v[j]);//全倒完还是只倒一部分?node k;memcpy(&k,&u,sizeof(u));k.outw=u.outw+amount;//更新具体值k.v[i]-=amount;k.v[j]+=amount;if(!vis[k.v[0]][k.v[1]])//避免重复入队,出现死循环{vis[k.v[0]][k.v[1]]=1;q.push(k);}}}}}//输出d或者d'while(d>=0){if(ans[d]>=0){printf("%d %d\n",ans[d],d);break;}d--;//d'}
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);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;
}

【UVA10603】Fill(优先队列+状态转移)相关推荐

  1. 洛谷 P1073 最优贸易 (分层图状态转移+SPFA,求最长路径;另附某dalao的超短代码:暴力+动规)

    题目链接1 题目链接2 另附某dalao的超短代码:暴力+动规 P1073 最优贸易 题目描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市. 任意两个城市之间最多只有 ...

  2. Trie树进阶:Double-Array Trie原理及状态转移过程详解

    前言: Trie树本身就是一个很迷人的数据结构,何况是其改进的方案. 在本博客中我会从DAT(Double-Array Tire)的原理开始,并结合其源代码对DAT的状态转移过程进行解析.如果因此你能 ...

  3. 根据状态转移写状态机-三段式

    根据状态转移写状态机-三段式 题目描述 如图所示为两种状态机中的一种,请根据状态转移图写出代码,状态转移线上的0/0等表示的意思是过程中data/flag的值. 要求: 1. 必须使用对应类型的状态机 ...

  4. Wooden Sticks POJ - 1065(最大上升子序列+动态规划状态转移思维)

    题意: 给你n个木棍的长度和重量,让其成为上升序列,如果不能达到,就需要重新一分钟设置. a)第一个木棍的准备时间为1分钟. b)在处理长度为l和重量为w的棒之后,如果l <= l'并且w &l ...

  5. Going Dutch BAPC( 状态转移DP)

    题目描述 You and your friends have just returned from a beautiful vacation in the mountains of the Nethe ...

  6. 状态转移表+State模式

    为了给用户提供更好的体验方式,多级联动,多种选择方式,半智能化的容错能力等是我们采用的手段,同时这对软件的开发带来了更多的复杂性.我们需要考虑在各种不同状态下,按钮的功能,以及转换. 在我做过的若干项 ...

  7. Codeforces Round 63 (Rated for Div. 2) F. Delivery Oligopoly dp+图论状态转移

    题目链接: https://codeforces.com/contest/1155/problem/F 题意: 现在给你一个 141414 个点的无向边双联通图,现在要你删掉一些边,使得留下来的边最少 ...

  8. 为什么只有状态转移算法才是真正意义上的智能优化算法,其它的都是“假冒伪劣”?

    0 旁白 长期以来,"论文为王"的观念被推崇至上,没有论文就没有发言权,发表了大量学术论文才能高谈阔论.坐而论道,以至于出现"大家都忙着写论文,没有时间搞科研" ...

  9. 状态机控制移位寄存器multisim仿真过程中出现的状态变量和状态转移条件不匹配的问题

    问题如下: 当我们在进行到0000001时,状态变量应该取值为s1s0=10 但在实际仿真过程中出现了s1s0依旧在0000001时保持01不变,在0000001结束到1000000复位时才发生01到 ...

  10. 第五章--第八章 因果图 正交试验表 状态转移 流程分析

    1.因果图 鱼骨图 输入与输入关系:异.或.唯一.要求 输入与输出关系:恒等.非.与.或 2.正交试验表 因子:所有参与试验的影响试验结果的条件称为因子 水平:影响试验因子的取值或输入称为水平 整齐可 ...

最新文章

  1. 【控制】《多无人机协同控制技术》周伟老师-第7章-基于多模型预测控制的无人机编队运动控制策略
  2. vs2008生成自定义dll,VS2008发布、生成网站时设置固定的dll文件名
  3. ps画布扩展颜色灰色不可用的原因和解决方法
  4. 苦难是人生必须经历的一课
  5. java输入年月判断当月天数_java输入月份,年份,显示对应月份的天数,
  6. nginx程序访问linux任意目录,通过nginx访问linux目录
  7. echarts 系列一
  8. mySQL中replace的用法
  9. 数字冰雹智慧城市大数据可视化分析决策系统
  10. MySql优化面试题
  11. 201671030109 词频统计软件项目报告
  12. 如何缩小jpg图片大小kb?手机照片怎么压缩大小?
  13. Spider爬虫框架之Spiders模块
  14. PCL中点云配准(非常详细,建议收藏)
  15. Clear Type之父谈阅读革命(转载)
  16. 技术支持快递第6 期
  17. 《惢客创业日记》2018.10.29(周一) 中国只有一个雷军,却有千万个中小企业
  18. 计网 ---第8章 网络互联设备
  19. vim编辑页面怎么退出_linux系统中如何进入退出vim编辑器
  20. 利用博客提交作业的程序设计课程实践模式

热门文章

  1. C++的 RTTI 观念和用途
  2. office2010的安装和卸载
  3. 国内外网站设计与浏览习惯的差异
  4. Google提供的超强圆角效果
  5. tomcat与java的版本_Tomcat JVM版本与JAVA_HOME不同
  6. spring mvc 中,直接注入的 HttpServletRequst 是否安全呢?
  7. 山东大学往年c语言期末试题及答案,山东大学历年C语言题库.pdf
  8. java mysql tree_java面試題:你了解mysql的B+TREE索引嗎?
  9. 【转】JQuery中$.each 和$(selector).each()的区别详解
  10. 转:Maven通俗讲解