题意:

给定三个杯子容量,初始只有第三个杯子满,其余为空,求最少需要倒多少水才能让某一杯子中有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. Oracle中的日期数据类型

    TimeStamp日期类型 TimeStamp数据类型用于存储日期的年.月.日,以及时间的小时.分和秒,其中秒值精确到小数点后6位,该数据类型 同时包含时区信息.systimestamp函数的功能是返 ...

  2. echart分组柱形图绑定数据

    <!DOCTYPE html> <head> <meta charset="utf-8"> <title>ECharts </ ...

  3. Laravel5中防止XSS跨站攻击的方法

    本文实例讲述了Laravel5中防止XSS跨站攻击的方法.分享给大家供大家参考,具体如下: Laravel 5本身没有这个能力来防止xss跨站攻击了,但是这它可以使用Purifier 扩展包集成 HT ...

  4. jsp中提示修改成功

    修改成功提示 servert包 request.setAttribute("success", "修改失败"); 效果而 function f(){ var n ...

  5. ftp 上传与下载

    //上传 ftpmg.Upload("", DateTime.Now.ToString("yyyyMMddhhmmss")); //下载 ftpmg.Downl ...

  6. java封装的优点

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机 ...

  7. C#代码规范(简版)

    C#项目代码规范 目的 1.方便代码的交流和维护. 2.不影响编码的效率,不与大众习惯冲突. 3.使代码更美观.阅读更方便. 4.使代码的逻辑更清晰.更易于理解. 在C#中通常使用的两种编码方式如下 ...

  8. Android常规布局(网络异常布局、空数据布局,未登录布局等)切换工具类,Layout切换

    本人已整理好发布到github,已优化. github地址:https://github.com/buhuiming/StatusLayoutManager 使用:compile 'com.bhm.s ...

  9. day21-5 类的多态与多态性

    类的多态与多态性 多态 多态指的是一类事物有多种形态,如动物有多种形态:人.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物 ...

  10. asp 数据库 模块化 - 思路是没一个页面有一个自己的数据类 这里用nPath表示

    <!--#include file="db_class.asp" --> <% '当前页面数据 nPath = "..\..\.." 't模块 ...