解题思路:这是神奇的一题,一定要好好体会。见代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = ;
int vis[maxn][maxn], ans[maxn], cap[]; struct node{
int v[], cnt;
friend bool operator <(node A, node B){
return A.cnt > B.cnt; //cnt更小的优先级更高
}
}; priority_queue<node> q; //优先队列 void Change(node u)
{
for(int i = ; i < ; i++)
{
int d = u.v[i];
//ans[d] < 0表示该点目前没有访问过
//找出走到容量为d的点时所倒水的最小总量
if(ans[d] < || u.cnt < ans[d]) ans[d] = u.cnt;
}
return ;
} void solve(int a, int b, int c, int d)
{
cap[] = a, cap[] = b, cap[] = c; //初始化三个杯子的容量
node s, s1;
//每个杯子中初始状态所含有的水
s.v[] = , s.v[] = , s.v[] = c, s.cnt = ;
vis[][] = ; //标记第一个和第二个杯子中水的状态已经出现过
while(!q.empty()) q.pop();
q.push(s); while(!q.empty())
{
s = q.top();
q.pop(); Change(s); //好好体会
if(ans[d] >= ) break; //表示已经符合题意,可以跳出 //从杯子i中把水倒到杯子j中
for(int i = ; i < ; i++) for(int j = ; j < ; j++)
{
if(i == j) continue; //不可能倒水到自身
if(s.v[i] == || s.v[j] == cap[j]) continue;//i为空或j已经满
int tmp = min(s.v[i], cap[j] - s.v[j]); //到底倒完i还是将j倒满
s1 = s; //s的状态要保存下来,还要进行下一次循环。
//杯子i中的水增加,j中的水减少,总转移两增加
s1.v[i] = s.v[i] - tmp, s1.v[j] = s.v[j] + tmp, s1.cnt = s.cnt + tmp;
if(!vis[s1.v[]][s1.v[]]) //如果这种状态之前没出现过
{
vis[s1.v[]][s1.v[]] = ;
q.push(s1); //入队列
}
} }
while(d >= )
{
if(ans[d] >= ) //符合条件,刚好为题目所说的d,或与它接近
//的最小符合条件的数
{
printf("%d %d\n", ans[d], d);
return ; //直接返回
}
d --;
}
return ;
} int main()
{
int t, a, b, c, d;
scanf("%d", &t);
while(t --)
{
scanf("%d %d %d %d", &a, &b, &c, &d); memset(vis, , sizeof(vis));//一定要初始化
memset(ans, -, sizeof(ans)); solve(a, b, c, d);
}
return ;
}

UVa10603 Fill的更多相关文章

  1. UVA-10603 Fill (BFS)

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

  2. 1.1.1最短路(Floyd、Dijstra、BellmanFord)

    转载自hr_whisper大佬的博客 [ 一.Dijkstra 比较详细的迪杰斯特拉算法讲解传送门 Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkstra常常作为其他算 ...

  3. 最短路算法详解(Dijkstra/SPFA/Floyd)

    新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...

  4. 【UVA10603】Fill (构图+最短路)

    题目: Sample Input22 3 4 296 97 199 62Sample Output2 29859 62 题意: 有三个杯子它们的容量分别是a,b,c, 并且初始状态下第一个和第二个是空 ...

  5. UVA10603 倒水问题 Fill

    伫倚危楼风细细,望极春愁,黯黯生天际.草色烟光残照里,无言谁会凭阑意. 拟把疏狂图一醉,对酒当歌,强乐还无味.衣带渐宽终不悔,为伊消得人憔悴.--柳永 题目:倒水问题 网址:https://onlin ...

  6. iOS 2D绘图 (Quartz2D)之路径(stroke,fill,clip,subpath,blend)

    像往常一样 这个系列的博客是跟着大神的脚步来的.按照往例 在此贴出原博客的出处: http://blog.csdn.net/hello_hwc?viewmode=list我对大神的崇拜之情 如滔滔江水 ...

  7. dev_set_draw的fill和margin模式

    注意:分别观察两张填充模式,一种是内部填充,一种是边缘填充.还有一种缺省的填充. Name dev_set_draw — Define the region fill mode. Signature ...

  8. scala 学习之: list.fill 用法

    题目描述: Decode a run-length encoded list. Given a run-length code list generated as specified in probl ...

  9. 急!JDBC问题,发生通信错误。错误位置:Reply.fill()。消息:数据不足。 ERRORCODE=-4499, SQLSTATE=08001

    代码如下:Class.forName("com.ibm.db2.jcc.DB2Driver");Connection conn = DriverManager.getConnect ...

随机推荐

  1. POJ 2195

    #include<iostream>//by Chengdacaizi #include<stdio.h> #include<vector> #include< ...

  2. ARM系列产品

    ARM7系列 ARM9系列 ARM9E系列 ARM10E系列 SecurCore系列 Intel的StrongARM ARM11系列 Intel的Xscale 其中,ARM7.ARM9.ARM9E和A ...

  3. 深入浅出ES6(十二):代理 Proxies

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 请看这样一段代码: var obj = new Proxy({}, { get: ...

  4. INTERESTING AND OBSCURE INHERITANCE ISSUES WITH CPP

    1. using 关键字 使用 using 关键字,可以将父类中被隐藏的函数暴露在子类中,但是需要注意的是,在相同情况下,子类函数的优先级更高. 2.  继承构造函数(C++11) 在c++11之前, ...

  5. 关于yum仓库的中的软件包下载

    在Linux系统下,很多软件的安装我们都会选择使用yum的方式安装,因为简单方便,易于管理. 有时我们可能会有这样的一个需求:即喜欢上yum仓库中的一个软件了,想要下载到本地.该怎么办呢? 实现方法不 ...

  6. C#DataGrdviewl加入checkBox全选删除

    #region 加入checkBox /// <summary> /// 加入checkBox /// </summary> /// <param name=" ...

  7. Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑

    一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...

  8. Android:Intel Atom x86模拟器的安装与使用

    1.下载硬件加速执行管理器haxm-windows_r05.zip,找到系统对应版本,并安装 2.下载安卓x86系统映象sysimg_x86-19_r01.zip,不区分系统环境,解压得到x86文件夹 ...

  9. SSIS ->> 通过Checkoints实现SSIS的包重启(Package Restartability Fullfilled By Checkoints)

    Checkpoints是实现SSIS包重载的基础.它的原理是把当前运行环境的配置.变量以及到了包运行到哪一步和哪一步失败这些信息写入到一个文件中.而且有一点很重要,Checkpoint只发生在Cont ...

  10. LinuxMint使用中文输入法

    自从转战linux系统以来,最痛苦的事情就是没有一款能让我满意的中文输入法了 不过今天我终于发现了一个让我比较满意的输入法(小小输入法),真的很不错 我试过不少输入法,但是还是小小输入法最适合我: 搜 ...