题意:

给定三个杯子容量,初始只有第三个杯子满,其余为空,求最少需要倒多少水才能让某一杯子中有d升水,如果不能达到,则小于d且尽量接近。

分析:

因为要求转移水量最少,所以采用优先级队列保存每次的状态,保证每次都是取出转移水量最少的点进行扩展。bfs求出杯中水达到d(接近d)时最少转移水量。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=205, INF=0x3fffffff;
struct Node{
int n[3];
int dist;
bool operator < (const Node& a) const{
return dist > a.dist;
}
};
int vis[maxn][maxn], v[3], ans[maxn], d;
void bfs()
{
memset(vis, 0, sizeof(vis));
memset(ans, -1, sizeof(ans));
priority_queue<Node>q;
Node s;
s.n[0]=0, s.n[1] = 0, s.n[2] = v[2];
s.dist = 0;
vis[0][0]=1;
q.push(s);
while(!q.empty()){
Node t = q.top(); q.pop();
for(int i = 0; i < 3; i++){
if(ans[t.n[i]]<0) ans[t.n[i]] = t.dist;
else ans[t.n[i]] = min(ans[t.n[i]], t.dist);
}
if(ans[d]>=0) break;
for(int i = 0; i < 3; i++){//i->j
for(int j = 0; j < 3; j++){
if(i!=j){
if(t.n[i]==0||t.n[j]==v[j]) continue;
int t1 = t.n[i], t2 = t.n[j];
int temp = min(t1, v[j] - t2);
Node nt;
nt.n[i] = t1 - temp;
nt.n[j] = t2 + temp;
nt.n[3-i-j] = t.n[3-i-j];
nt.dist = t.dist + temp;
if(!vis[nt.n[0]][nt.n[1]]){//总水量一定,前两个杯子水量确定,第三个杯子水量也确定了
vis[nt.n[0]][nt.n[1]] = 1;
q.push(nt);
}
}
}
}
}
while(ans[d]<0) d--;
printf("%d %d\n",ans[d], d);
return;
} int main (void)
{
int T;scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&v[0],&v[1],&v[2],&d);
bfs();
}
return 0;
}

UVA 10603_Fill的更多相关文章

  1. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  2. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  3. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  4. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  5. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  6. UVA数学入门训练Round1[6]

    UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...

  7. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  8. UVA - 10375 Choose and divide[唯一分解定理]

    UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  9. UVA - 11584 Partitioning by Palindromes[序列DP]

    UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...

随机推荐

  1. 【RSA】在 ASP.NET Core中结合web前端JsEncrypt.JS使用公钥加密,.NET Core使用私钥解密;

    有一个需求,前端web使用的是JsEncrypt把后端给的公钥对密码进行加密,然后后端对其进行解密: 使用的类库如下: 后端使用第三方开源类库Bouncy Castle进行RSA的加解密和生成PEM格 ...

  2. AJPFX总结关于JVM的基础知识

    写在前面 之前老大让做一些外包面试,我的问题很简单: 介绍一下工作中解决过比较 有意思的问题. HashMap使用中需要注意的点. 第一个问题主要是想了解一下对方项目经验的含金量,第二个问题则是测试下 ...

  3. 使用一个CSS Class去给标签定义Style

    使用一个CSS Class去给标签定义Style 类是可重用的样式,可以添加到HTML元素. 下面是一个CSS类声明的例子: <style>   .blue-text {     colo ...

  4. 洛谷 P1615 西游记公司

    题目背景 一道极其无厘头的题目 题目描述 事情是这样的:西游记中的孙沙猪(孙杀猪)三徒弟在西天取经之后开始进入厦门大学经贸系学习经济,在1个小时的学习后,他们用暴力手段毕业了.然后,他们创办了三个公司 ...

  5. Android(java)学习笔记199:JNI之JNI概念

    1. JNI是什么? java native interface (java本机接口) 比如方法声明: public final native Class<?>  getClass(): ...

  6. Android APK生成证书并签名方法

    Android APK生成证书并签名方法 android cordova keystore android证书签名 阅读:925 时间:2018年09月20日 Android开发者可能对此很熟悉.使用 ...

  7. 时钟周期 VS 机器周期

    时钟周期vs机器周期 Clock cycle The speed of a computer processor, or CPU, is determined by the clock cycle, ...

  8. vim要粘贴的话,先set paste,然后粘贴,然后再set nopaste

    要粘贴的话,先set paste,然后粘贴,然后再set nopaste

  9. 第1节 MapReduce入门:11、mapreduce程序的入门

    1.1.理解MapReduce思想 MapReduce思想在生活中处处可见.或多或少都曾接触过这种思想.MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景). ...

  10. PowerPoint幻灯片手动翻页设置技巧

    步骤: 幻灯片放映>设置幻灯片放映>手动