第七章fill

总结一下这题的解题步骤:

1.将问题抽象成某种模型,比如这题就是找出一个有d的状态,且要倒水量最小,平时写的都是路径最小

,用的是普通队列,这题要把倒水量最小考虑进去就需要用优先队列

即:用优先队列的就是在队列中不断找出倒水量最小的状态,然后判断是否一个容器中的水为d

普通队列可以用来求最短路径长度,即不断的找出离原始状态最近的状态,判断是否有一个容器中的水为d

所以其实也可以用优先队列来找最短路径只要优先队列是以路径长度来排序的即可

2.写出更新状态的算法,最简单的就是枚举出所有可能的情况完全不考虑重复的问题,模拟倒水的过程

3.用具体的例子验证一下算法的正确性

4.和之前学过的知识做比较,比如以后要是又找个什么路径,都其实可以尝试用优先队列

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

const int maxn=3;
int cap[maxn];
const int maxd=210;
int vis[maxd][maxd][maxd];

struct Node
{
    int v[3];
    int dist;

    bool operator< (const Node& rhs) const
    {
        return dist > rhs.dist;
    }

};

bool matchp(Node n,int d)
{
    if(n.v[0]==d || n.v[1]==d || n.v[2]==d)
        return true;
    else return false;
}

int bfs(int a,int b,int c,int& d)
{
    memset(vis,0,sizeof(vis));

    priority_queue<Node> q;

    Node st;
    st.v[0]=0;
    st.v[1]=0;
    st.v[2]=cap[2];
    st.dist=0;

    q.push(st);

    while(!q.empty())
    {
        Node nod=q.top();
        q.pop();

        if(matchp(nod,d)) return nod.dist;

        //update
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                if(i!=j)
                {
                    Node newnod=nod;

                    if(newnod.v[i]>cap[j]-newnod.v[j])
                    {
                        newnod.v[i]-=cap[j]-newnod.v[j];
                        newnod.dist+=cap[j]-newnod.v[j];
                        newnod.v[j]=cap[j];
                    }
                    else
                    {
                        newnod.v[j]+=newnod.v[i];
                        newnod.dist+=newnod.v[i];
                        newnod.v[i]=0;
                    }

                    if(vis[newnod.v[0]][newnod.v[1]][newnod.v[2]]==1) continue;

                    vis[newnod.v[0]][newnod.v[1]][newnod.v[2]]=1;
                    q.push(newnod);
                }
    }

    return bfs(a,b,c,--d);
}

int main()
{
    int a,b,c,d;
    cin>>a>>b>>c>>d;

    cap[0]=a;
    cap[1]=b;
    cap[2]=c;

    int ans=bfs(a,b,c,d);

    printf("%d %d\n",ans,d);

    return 0;
}
时间: 2024-12-17 12:55:22

第七章fill的相关文章

第七章 KinectV2结合MFC显示和处理图像数据(下)

第七章  KinectV2结合MFC显示和处理图像数据(下) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect SDK v2.0.这些都可以在百度上找到,download下来安装一下即可. 一.在MFC中如何显示OpenCV的图像Mat 前段时间一直在学习opencv,但学习过程中写的例子都是基于控制台的.今天打算把之前写的一些例子都移植到MFC中,基本上就是复制以前的代码,唯一的区别在于在控制台中,

c++ primer plus(第6版)中文版 第七章编程练习答案

第七章编程练习答案 7.1编写一个程序,用户不停输入两数,直到有0出现为止,计算调和平均数 //7.1编写一个程序,用户不停输入两数,直到有0出现为止,计算调和平均数 #include <iostream> using namespace std; double average (unsigned x, unsigned y) { return (2.0 * x * y / (x + y)); } int main () { while (true) { unsigned x, y; cout

D3.js的v5版本入门教程(第七章)—— 比例尺的使用

D3.js的v5版本入门教程(第七章) 比例尺在D3.js中是一个很重要的东西,我们可以这样理解d3.js中的比例尺——一种映射关系,从domain映射到range域(为什么会是domain和range呢?等一下你就会看到,因为我们在建立比例尺是常常会用到domain()和range()两个函数,当然不是绝对的,D3中有很多类型的比例尺) 下面介绍在本套教程中常用的两种比例尺 线性比例尺序数比例尺        线性比例尺 domain域和range域都可以连续变化 <body> <sc

[书籍翻译] 《JavaScript并发编程》第七章 抽取并发逻辑

本文是我翻译<JavaScript Concurrency>书籍的第七章 抽取并发逻辑,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript并发编程方面的实践. 完整书籍翻译地址:https://github.com/yzsunlei/javascript_concurrency_translation .由于能力有限,肯定存在翻译不清楚甚至翻译错误的地方,欢迎朋友们提issue指出,感谢. 到本书这里,我们已经在代码中明确地模拟了并发问题.使

第七章

第七章 控制发光二极管. 尽管linux 驱动直接和硬件打交道,但并不是linux驱动直接向硬件中的内存写数据,而是与本机的i/o内存进行交互.所谓I/O内存是通过各种接口(PCI, USB.蓝牙以太网等)连接到主机的硬件在主机的内存映射.Linux内核提供了多个与I/O内存交互的函数.Linux内核的内存管理模块负责同步I/O内存与硬件的数据. 每一个连接Linux 的硬件在I/O内存中都会有映射首地址.在使用ioread 32.ioread32等函数读写I/O内存时需要指定这些首地址.Led

第七章:常用类

第七章:常用类 包装类 java中有8中基本类型,对应有八种包装类作用:包装类中封装了该类型常用的属性和方法,以方便操作.byte---->Byteshort--->Shortint--->Integerlong---->Longfloat---->Floatdouble---->Doublechar---->Characterboolean---->Boolean装箱:将基本数据类型转换成包装类,经常通过构造方法完成.Integer i = new Int

构建之法学习(第七章 MSF)

第七章 MSF MSF(Microsoft Solution Framework)微软解决方案框架: MSF是一套大型系统开发指南,是微软推荐的软件开发方法,它描述了如何用组队模型.过程模型和应用模型来开发Client/Server结构的应用程序,是在微软的工具和技术的基础上建立并开发分布式企业系统应用的参考. 一.MSF 9条基本原则 1.推动信息共享与沟通 --把所有信息都保留并公开,讨论要包括所有涉及的角色,决定要公开并告知所有人. 当然,对牵涉到技术机密.安全性等信息要采取必要的保护措施

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

第九章 前七章总结考试答案

前七章总结测验见附件内容