题意 : 有装满水的6升的杯子、空的3升杯子和1升杯子,3个杯子中都没有刻度。不使用道具情况下,是否可量出4升水呢?

你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯子装满了c升水,其他两个杯子为空。最少需要倒多少升水才能让某一个杯子中的水有d升呢?如果无法做到恰好d升,就让某一个杯子里的水是d'升,其中d'<d并且尽量接近d。(1≤a,b,c,d≤200)。要求输出最少的倒水量和目标水量(d或者d')。

分析 : 紫书P202。

#include<bits/stdc++.h>
using namespace std;
 + ;
struct Node
{
    ], dist;
    bool operator < (const Node & rhs) const{//Caution!
        return dist > rhs.dist;
    }
};
];//learn->有近似解的存在,所以使用ans来保存d或者<d升水转移的水量,并
                     //且全部赋值-1,答案的查找和数组的初值有点类似背包刚好装满时候的处理
int vis[maxn][maxn];
inline void initialize()
{
    memset(ans, -, sizeof(ans));
    memset(vis, , sizeof(vis));
}
inline void update_ans(Node &temp)
{
    ; i<; i++){
        int Vol = temp.v[i];
         || ans[Vol] > temp.dist){//分别表示一开始和有更优解的情况
            ans[Vol] = temp.dist;
        }
    }
}
inline void solve(int a, int b, int c, int d)
{
    priority_queue<Node> pq;
    Node Fir_node;
    Fir_node.dist = ;
    Fir_node.v[] = , Fir_node.v[] = , Fir_node.v[] = c;
    pq.push(Fir_node);
    vis[][] = ;
    while(!pq.empty()){
        Node u = pq.top();
        pq.pop();
        update_ans(u);
        ) break;
        ; i<; i++){
            ; j<; j++){
                if(j!=i){
                     || u.v[j]==cap[j]) continue;//此过程描述i倒向j,所以在i空或j满的情况下是无法做到的。模拟的代码应多考虑实际意义。
                    int Trans = min(cap[j], u.v[i]+u.v[j]) - u.v[j];//注意这里是min
                    Node New;
                    memcpy(&New, &u, sizeof(u));//*learn->结构体也可以这样赋值
                    New.v[i] -= Trans;
                    New.v[j] += Trans;
                    New.dist = u.dist + Trans;
                    ]][New.v[]]){
                        pq.push(New);
                        vis[New.v[]][New.v[]] = ;
                    }
                }
            }
        }
    }
    ){
        ){
            printf("%d %d\n", ans[d], d);
            return ;
        }
        d--;
    }
}
int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        int a, b, c, d;
        initialize();
        scanf("%d %d %d %d", &a, &b, &c, &d);
        cap[] = a, cap[] = b, cap[] = c;
        solve(a, b, c, d);
    }
    ;
}

瞎 :

①类似的倒水问题,模拟倒水的操作可以参考刘汝佳的代码,简洁

        ; i<; i++){
            ; j<; j++){
                if(j!=i){
                     || u.v[j]==cap[j]) continue;///此过程描述i倒向j,所以在i空或j满的情况下是无法做到的。
                    int Trans = min(cap[j], u.v[i]+u.v[j]) - u.v[j];//*max -> min
                    Node New;
                    memcpy(&New, &u, sizeof(u));//*->learn
                    New.v[i] -= Trans;
                    New.v[j] += Trans;
                    New.dist = u.dist + Trans;
                    ]][New.v[]]){
                        pq.push(New);
                        vis[New.v[]][New.v[]] = ;
                    }
                }
            }
        }

倒水

②对于此类初始和结束都知道的,考虑存储状态进行广搜操作,注意状态的定义

③如果对于每一次状态转移的某一权值有要求,可以考虑使用结构体存储状态入队,然后根据某一需要的元素进行重载小于号,队列则使用优先队列

④这道题的广搜解答树明显有许多末端节点,所以应该全都去与暂存的答案比较,而不是一搜到答案就OK,而类似最短路的模型则是一搜到就推出,因为权值就是路径,第一个搜到的肯定是路径最短的,而此题很明显并不是转化成了最短路模型,如果是求倒水次数最少的话则是,现在求的是倒水量,所以在考虑将一道题进行状态转化然后进行搜索的时候,要区别答案是如何找出来的。

⑤对于搜索而言,状态很重要,对于现在这个局面,哪几个关键的信息能表示现在的状态,如何判重,答案如何存储和状态如何转移,都是决定能不能或者如何搜索的关键。

UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)的更多相关文章

  1. UVA 10603 - Fill BFS~

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...

  2. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  3. nyoj 21--三个水杯(隐式图bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...

  4. UVA 658 状态压缩+隐式图+优先队列dijstla

    不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...

  5. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  6. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

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

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

  8. UVa 10603 Fill [暴力枚举、路径搜索]

    10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...

  9. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

随机推荐

  1. [转帖]C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别

    C#中字典集合HashTable.Dictionary.ConcurrentDictionary三者区别 https://blog.csdn.net/yinghuolsx/article/detail ...

  2. Excel透视表基础之数据源、创建、基本术语、基本操作

    数据源的基本要求: 每列数据的第一行包含该列标题 不能包含空行或空列 不能包含空单元格 不能包含合并单元格 不能包含同类字段 如果包含空行.空列则删除空行和空列.如果包含空单元格则填充空单元格. 如果 ...

  3. Java 创建bat命令文件运行可执行jar包

    在可执行jar包所在文件夹下创建txt文件(必须在同一文件夹目录下),打开创建的txt文件输入如下内容并保存: @echo off java -jar 包名.jar pause 如下图所示: 然后将后 ...

  4. Anaconda配置环境变量+创建虚拟环境+pycharm使用虚拟环境

    Anaconda配置环境变量+创建虚拟环境 配置环境变量 没有添加系统变量,所有系统根本识别不了conda命令,找不到位置,所以添加以下系统变量: 添加对应Anaconda环境变量:(以自己的安装路径 ...

  5. CSP-S 2019游记

    Day 0 下午到了广州,酒店还不错,不好的是附近没有什么吃饭的地方 zyd和ljz巨神说如果上了450就女装. 晚上看了一下写过模板,本来准备敲几个新模板的的结果被卡常,心态没了.于是又把wys的卡 ...

  6. shell with hadoop

    shell 命令操作 hadoop 之前多少提及过,这里做个总结. shell with hdfs 基本命令 bin/hadoop fs 大于下面的命令 bin/hdfs dfs dfs 是 fs 的 ...

  7. kafka 教程(三)-远程访问

    远程连接 kafka 配置 默认的 kafka 配置是无法远程访问的,解决该问题有几个方案. 方案1 advertised.listeners=PLAINTEXT://IP:9092 注意必须是 ip ...

  8. Codeforces 1220B. Multiplication Table

    传送门 冷静分析容易发现,我们只要能确定一个数的值,所有值也就可以确定了 确定一个数的值很容易,$a_ia_j=M_{i,j},a_ia_k=M_{i,k},a_ja_k=M_{j,k}$ 然后就可以 ...

  9. CentOS6.6安装使用MyCat

    https://blog.csdn.net/u012948302/article/details/78902092 1. 安装Java环境MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安 ...

  10. 更新 | 2019年9月计算机二级office模拟题库

    随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试( ...