- 题目大意

有三个已知体积但不知刻度的杯子,前两个杯子中初始时没有水,第三个装满水,问是否可以倒出d升水,如果倒不出,则倒出一个最大的d’,使得d’<=d,并且在这个过程中要求总倒水量最少。

- 解题思路

可以用DFS加上优先队列来解决,以前两个杯子中的水量作为标记状态。只不过这次不是要求的最求最少步数,而是要求最少倒水量即可。

- 代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
int maps[500][500];
int cnt[500];
struct Edge
{int m[3],sum;Edge(int a,int b,int c,int s){m[0]=a,m[1]=b,m[2]=c,sum=s;}bool operator <(const Edge &rhs)const{return sum>rhs.sum;}
};void bfs(int a,int b,int c,int d)
{int num[3]={a,b,c};priority_queue<Edge>q;memset(maps,0,sizeof(maps));memset(cnt,-1,sizeof(cnt));maps[0][0]=1;q.push(Edge(0,0,c,0));while(!q.empty()){Edge u=q.top();q.pop();for(int i=0;i<3;i++){if(cnt[u.m[i]]<0||u.sum<cnt[u.m[i]])cnt[u.m[i]]=u.sum;}if(cnt[d]>=0)break;for(int i=0;i<3;i++){if(u.m[i]==num[i])continue;for(int j=0;j<3;j++){if(i==j||u.m[j]==0)continue;int mid=min(num[i],u.m[j]+u.m[i])-u.m[i];Edge tmp=u;tmp.sum+=mid;tmp.m[i]+=mid;tmp.m[j]-=mid;if(!maps[tmp.m[0]][tmp.m[1]]){maps[tmp.m[0]][tmp.m[1]]=1;q.push(tmp);}}}}while(d>=0){if(cnt[d]>=0){printf("%d %d\n",cnt[d],d);return;}--d;}
}int main()
{int a,b,c,d;int n;scanf("%d",&n);while(n--){scanf("%d%d%d%d",&a,&b,&c,&d);bfs(a,b,c,d);}return 0;
}

  

转载于:https://www.cnblogs.com/alpacadh/p/8523858.html

J - Fill (UVA - 10603)相关推荐

  1. 倒水问题(Fill,UVA 10603) lrj白书 p202

    看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /*状态start到各个状态u1,u2,u3.....的倒水量分别为u1.dist,u2.dist,u3.dist....*//* ...

  2. J - Fire! UVA - 11624

    J - Fire! UVA - 11624 题意:火每次能烧到上下左右,人碰到非墙的边界则逃火成功,求最短的逃离时间. 由于bfs每个位置最多入队出队一次,所以复杂度为 1e6 一发bfs直接TLE, ...

  3. UVA 10603 - Fill(dijkstra + 状态图)

    题目链接 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  4. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  5. UVa 10603 Fill (BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻,某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和dd ...

  6. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a,b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  7. UVA 10603 Fill

    这道题其实是个隐形图(bfs),由开始状态往后面推就行了 #include<iostream> #include<cstdio> #include<algorithm&g ...

  8. UVa 10603 - Fille

    題目:倒水問題,有已知容量的三個杯子,前兩個是空的最後的是滿的. 每次可以將一杯水倒向另一杯,只可能是全部倒進去,或者被倒的杯子滿了. 求到達目標,最小的移動水量,如果沒有目標求出不超過的最大值. 分 ...

  9. J - Virus UVA - 12511——最长上升递增子序列

    Think: 1题目理解:T组测试数据,每组测试数据输入两串字符,求最大上升递增子序列 2思考:dp:通过状态转移方程优化节省内层一层for循环? 建议参考博客 参考: 题目大意:T种情况,每种情况2 ...

最新文章

  1. ASP.net随机数应用实例
  2. 有关ubuntu16.04进行sudo apt-get update更新时出现:‘。。。N: 无法安全地用该源进行更新,所以默认禁用该源。。。’等问题解决方案
  3. timestamp的两个属性:CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP
  4. 水域大小 Java_水域大小
  5. maile:教你程序员怎么发邮件
  6. doxygen问题集锦
  7. 英伟达3060Ti安装GPU版本TensorFlow2.X
  8. java开源springboot项目_使用Spring Boot的10多个免费开源项目
  9. TeXstuidio没有中文的拼写检查
  10. Echarts数据可视化全解
  11. Kubernetes部分Volume类型介绍及yaml示例
  12. CF 235C. Cyclical Quest [后缀自动机]
  13. wdr通刷固件_西数硬盘维修工具WDR5.3简体中文版下载及图文教程
  14. CVPR2021 多目标跟踪(MOT)汇总
  15. #define 和 #typedef , const的区别
  16. python sleep函数什么意思_python中sleep函数用法实例分析
  17. Unity SetFromToRotation和FromToRotation的区别
  18. 管理学(第二课)笔记
  19. 博士生的你,择偶标准是什么?
  20. 互联网早报:淘宝发布购物车分享功能,双十一有望分享微信朋友圈

热门文章

  1. ResNet、Faster RCNN、Mask RCNN 是专利算法吗?盘点何恺明参与发明的专利!
  2. 面经 | 无论文、无实习拿下腾讯CV算法岗
  3. java订单超时取消设计_PHP如何实现处理过期或者超时订单的,并还原库存
  4. 海龟绘图小动物_被解救海龟经野化训练后放归大海,这一幕让人惊叹不已
  5. arm架构和x86架构_ARM、X86和MIPS主流架构优缺点分析
  6. Linux gedit
  7. AlexNet原理和实现
  8. 软考信息安全工程师备考笔记1:第一章信息安全基础备考要点
  9. ngrok服务器搭建 window_.NET开发框架(三)高可用服务器端设计
  10. 小程序的 rpx布局问题