题意:

给你三个杯子,a,b,c,没有刻度,刚开始c杯是满的,倒水的要求,要么倒出水的杯子倒空,要么倒入杯子倒满.

结果:

要求某个杯子内有d水量,并且倒出的水量最少,如果倒不出d水量,那么倒出d1(d1<d)水量,并且倒出的水量最少

解题思路:

总的水量为c,只要知道前俩个杯子的水量,那么第三个杯子的水量就确定了,所以,状态数最大只有a * b种,所以一个二维数组标记状态就够.

要求倒出的水量最少,那么使用优先队列,按照倒出的水量最少开始搜索.

初始化结点为(0,0,c),由这个结点开始往外扩展,此时倒出的水量为0,结果d为0,注意代码内有个特判,如果d >= c,那么最大的d就是c,倒出的水量为0

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <memory.h>
  4. #include <queue>
  5.  
  6. using namespace std;
  7. const int NN = 201;
  8. int a[3];
  9. int d;
  10. int maxD = -1;
  11. int maxNum = 0;
  12. //记录c1,c2,已知c1,c2,c3就可以确定
  13. int vis[NN][NN];
  14. class State
  15. {
  16. public:
  17. int a[3];
  18. int waterNum;
  19. State()
  20. : waterNum(0)
  21. {
  22. a[0] = 0;
  23. a[1] = 0;
  24. a[2] = 0;
  25. }
  26. State(int d1, int d2, int d3, int w)
  27. : waterNum(w)
  28. {
  29. a[0] = d1;
  30. a[1] = d2;
  31. a[2] = d3;
  32. }
  33. bool operator ()(State& a, State& b)
  34. {
  35. return a.waterNum > b.waterNum;
  36. }
  37. };
  38. priority_queue<State, vector<State>, State> q;
  39. void bfs()
  40. {
  41. while (!q.empty())
  42. {
  43. State s = q.top();
  44. q.pop();
  45. for(int i = 0; i < 3; i++)
  46. for(int j = 0; j < 3; j++)
  47. {
  48. if(i == j || s.a[i] == 0)
  49. continue;
  50. //把水从i导入j中
  51. //要么i倒空,要么j倒满
  52. int dj = a[j] - s.a[j];
  53. if(dj == 0)
  54. //j是满的,不能倒
  55. continue;
  56. //i杯内的水量
  57. int di = s.a[i];
  58. //倒出的水量
  59. State ss(s.a[0], s.a[1], s.a[2], s.waterNum);
  60. if(dj > di)
  61. {
  62. //i杯倒空
  63. ss.waterNum = ss.waterNum + di;
  64. ss.a[i] = 0;
  65. ss.a[j] = ss.a[j] + di;
  66. }
  67. else
  68. {
  69. //j杯倒满
  70. ss.waterNum = ss.waterNum + dj;
  71. ss.a[i] = di - dj;
  72. ss.a[j] = ss.a[j] + dj;
  73. }
  74. if(vis[ss.a[0]][ss.a[1]])
  75. continue;
  76. //判断当前状态
  77. if(ss.a[i] <= d && ss.a[i] > maxD)
  78. {
  79. maxD = ss.a[i];
  80. maxNum = ss.waterNum;
  81. }
  82. if(ss.a[j] <= d && ss.a[j] > maxD)
  83. {
  84. maxD = ss.a[j];
  85. maxNum = ss.waterNum;
  86. }
  87. if(maxD == d)
  88. return;
  89. q.push(ss);
  90. vis[ss.a[0]][ss.a[1]] = 1;
  91. }
  92. }
  93. }
  94. void clear()
  95. {
  96. while (!q.empty())
  97. q.pop();
  98. memset(vis, 0, sizeof(vis));
  99. maxNum = 0;
  100. maxD = 0;
  101. }
  102. int main()
  103. {
  104. int num;
  105. cin >> num;
  106. while (num--)
  107. {
  108. clear();
  109. cin >> a[0] >> a[1] >> a[2] >> d;
  110. if(d >= a[2])
  111. {
  112. cout << 0 << " " << a[2] << endl;
  113. continue;
  114. }
  115. State state(0, 0, a[2], 0);
  116. q.push(state);
  117. vis[0][0] = 1;
  118. bfs();
  119. if(maxD == 0)
  120. cout << 0 << " " << 0 << endl;
  121. else
  122. cout << maxNum << " " << maxD << endl;
  123. }
  124. return 0;
  125. }

  

uva10603-倒水问题-暴力枚举-隐式图搜索的更多相关文章

  1. uva-321-暴力枚举-隐式图搜索

    题意:给你n个房间,有许多灯的控制开关,i房间灯的开关在j房间,未开灯的房间不能进,i房间和j房间之间如果没有门,也不能从i进入到j,开始房间是1,并且灯是开着的,问你是否能够走到最后一个房间n,并且 ...

  2. UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)

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

  3. 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)

    这道题用到了很多知识点, 是一道好题目.      第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算.     第二这里是隐式 ...

  4. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  5. uva 10274 Fans and Gems(隐式图搜索+模拟)

    Fans and Gems Input: Standard Input Output: Standard Output Tomy's fond of a game called 'Fans and G ...

  6. [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索

    [HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...

  7. 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  8. UVA_10603 倒水问题 隐式图搜索

    这道题目是刘汝佳白书上的例题,没有LRJ在白书上提到的划归为搜索问题,还真是一时难以想到好的解法.即三个瓶子,任意的一个状态都是一个节点,最后就划归为一个搜索问题. 由于题目数据量不大,三个杯子容量都 ...

  9. 状态转移的最短路 隐式图搜索 UVA 658

    紫书365 题目大意:给你n个全都是bug的东西,然后每次可以修复,给你修复前后的状态,问最后如果能把bug全都修复,最少需要多少时间. 思路:从最初状态开始,然后枚举bug即可. 表示priorit ...

随机推荐

  1. 开源数据采集组件比较: scribe、chukwa、kafka、flume

    针对每天TB级的数据采集,一般而言,这些系统需要具有以下特征: 构建应用系统和分析系统的桥梁,并将它们之间的关联解耦: 支持近实时的在线分析系统和类似于Hadoop之类的离线分析系统: 具有高可扩展性 ...

  2. TStrings (TStringList)很有功能

    用 TStrings的Object 保存类的方式,来保存除了Items以外的值. 今天才发现,原来,TStrings下,还有 Items,Values,Items.Names,Items.Values ...

  3. CentOs6.7 python2.6升级到2.7.11

    1.查看当前python的版本 #python -V Python 2.6.6 2.下载Python-2.7.11 wget https://www.python.org/ftp/python/2.7 ...

  4. ubuntu-docker入门到放弃(四)容器的导入导出

    上一次我们讲了如何搭建自己私有的镜像管理仓库,实际上我们使用的依然是别人或者公共的image,今天就来说说如何将自己定制化的images上传到自己的私有仓库中,以供符合自己业务场景的项目来使用,如:我 ...

  5. 第一个javascript

    系统:windows10    编辑器:NotePad++ 首先开启浏览器的javascript,我的是google浏览器,步骤:设置--高级设置--内容设置--选中“允许所有网站使用javascri ...

  6. camtasis studio 未能创建视频内存资源。

    camtasis studio failed to create a video memory resource.camtasis studio 未能创建视频内存资源. 在工具--选项中取消GPU加速 ...

  7. Ubuntu 14.10 下Hadoop HttpFS 配置

    因为hadoop集群中需要配置一个图形化管理数据的截面,后来找到HUE,那么在配置HUE的过程中,发现需要配置httpfs,因为配置了httpfs,hue才能去操作hdfs中的数据. HttpFs能干 ...

  8. MATLAB的一些小技巧

    写论文要将图片保存为tiff格式,还要求dpi,还要标注,真是麻烦,下面的命令是最方便的程序化处理方式了 MATLAB text标注后 保存为 tiff 图片,图片到边框间无空白 clear all; ...

  9. mybatis 报错Result Maps collection does not contain value for java.lang.Integer

    重点:报错的方法和xml文件不一定是错误的位置,如果有多个xml文件,必须检查所有的文件 搜索  resultMap="java.lang.Integer" 找到对应的文件,改为  ...

  10. 廖雪峰Java6IO编程-1IO基础-1IO简介

    1.IO简介 IO是指Input/Output,即输入和输出: Input指从外部读取数据到内存,例如从磁盘读取,从网络读取. * 为什么要把数据读到内存才能处理这些数据呢? * 因为代码是在内存中运 ...