zoukankan      html  css  js  c++  java
  • USACO 2005 January Gold The Wedding Juicer

    题目

    题目链接,我只在poj上找到了题目,usaco居然上不去。

    大意就是说有一些(1 imes 1 imes 1)的小方块堆在一起,问最多能装多少水。

    我们在一次测试中出了这题,由于我写水题的能力太弱,挂掉了。

    算法1

    这是我当时想到的方法。

    我们可以统计出每一层能装多少水。由于层数达到了(10^9),所以需要离散化一下。

    我们可以用并查集来维护装水的面积。

    时间复杂度:(O(n^2 alpha (n^2)))

    算法2

    这是《算法艺术》(P89)上的例题(同时也是POI的原题!)。

    书上的想法是从外往内维护边缘的方块的高度,根据“木桶效应”,我们从中选一个最矮的来往里面更新,这个可以用优先队列加快速度。

    其实我觉得还可以这样思考:先令整个空间堆满水,除了在外围的方块。不妨设(h(i,j))为位于((i,j))的方块的高度,(f(i,j))为可以装多少水。我们可以不断地迭代更新:如果((x,y))((i,j))相邻,那么(f(x,y) = max(h(x,y), f(i,j)))。这样经过有限次数的迭代之后我们就得到了正确答案。当然,这样的效率是很低的,我们可以利用DijkstraOrz的思想,每次用(f)最小的去迭代其他的,由于它已经是最小的了,不可能再被人迭代了(这正是Dijkstra最短路的思想),所以我们每个点只需要去更新其他相邻的点一次。同样,我们也可以用优先队列来加快这一过程。

    时间复杂度:(O(n^2 log n^2))

  • 相关阅读:
    Linux内核等待队列机制介绍
    对数学的思考
    Linux 进程状态
    linux内核链表
    linux内核的经典书籍
    似乎最近发的Blog又少了
    抽象——放弃细节的另外一个说法
    成长
    发现QQ的一个小问题
    放上了一篇几个月前写的东西
  • 原文地址:https://www.cnblogs.com/wangck/p/4483011.html
Copyright © 2011-2022 走看看