问题描述

有这样一块土地,它可以被划分N*M个正方形小块,每块面积是一平方英寸,第i行第j列的小块可以表示成P(i,j)。这块土地高低不平,每一小块地P(i,j)都有自己的高度H(i,j)(单位是英寸)。

一场倾盆大雨后,由于这块地地势高低不同,许多低洼地方都积存了不少降水。假如你已经知道这块土地的详细信息,你能求出它最多能积存多少立方英寸的降水么?

输入格式

输入文件的第一行是两个正整数n和m,1<=n<=100,1<=m<=100,表示土地的尺寸。下面n行,每行m个整数(1..10000);第j行第i个数表示第j行第i列立方体的高。

输出格式

输出文件只有一个数,表示在这个建筑上可以聚合的积水的最大值

输入输出样例

输入

3 6
3 3 4 4 4 2
3 1 3 2 1 4
7 3 1 6 4 1

输出

5

下图是其方案:

题解:按高度建一个小根堆,一开始把所有边界上的点入堆,从中取出高度最小的点,从该点开始floodfill,如果碰到比他高的点,就把那个点入堆,如果碰到比他低或相等的点,将高度差累加进答案,然后从那个点继续floodfill。重复以上过程直到堆空。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct use{int x,y,h;
};
bool operator<(use x,use y){return x.h<y.h;}
priority_queue<use>q;
int map[101][101],dx[5],dy[5],n,m,ans;
bool f[101][101],ff[101][101];
inline int in(){char c=getchar();int x=0;while(c<'0'||c>'9')c=getchar();for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x;
}
inline void floodfill(int x,int y,int hh)
{//cout<<x<<' '<<y<<' '<<hh<<endl;for (int i=1;i<=4;i++){int xx,yy;xx=x+dx[i];yy=y+dy[i];if (xx>0&&xx<=n&&yy>0&&yy<=m&&!f[xx][yy]){if (map[xx][yy]<=-hh) {ans+=-hh-map[xx][yy];f[xx][yy]=true;floodfill(xx,yy,hh);}else {if (!ff[xx][yy]){use a;a.x=xx;a.y=yy;a.h=-map[xx][yy];q.push(a);ff[xx][yy]=true;}}}}
}
int main()
{freopen("wod.in","r",stdin);freopen("wod.out","w",stdout);n=in();m=in();dx[1]=1;dx[2]=0;dx[3]=-1;dx[4]=0;dy[1]=0;dy[2]=1;dy[3]=0;dy[4]=-1;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){map[i][j]=in();if (i==1||i==n||j==1||j==m){use a;a.x=i;a.y=j;a.h=-map[i][j];q.push(a);ff[i][j]=true;}}while (!q.empty()){use a;a=q.top();q.pop();if (!f[a.x][a.y]){f[a.x][a.y]=true;floodfill(a.x,a.y,a.h);}}cout<<ans;
}

【poi1999】【cogs239】【积水】【堆】【灌水法】【贪心】相关推荐

  1. 灌水导论——灌水法初步

    灌水法: Flood Fill 直译为大水漫灌,会造成土地盐碱化...... 但是,在OI中,灌水不失为水搜索的一种好方法呢~~ 灌水的思想: 灌水的思想其实就是从一个点(水源)出发,将符合条件可以到 ...

  2. 用灌水法解NOIP2017提高组D2第一题:奶酪

    题目描述 现有一块大奶酪,它的高度为> h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z> = ...

  3. 【一本通评测 1373】【堆】【贪心】鱼塘钓鱼

    鱼塘钓鱼 题目 解题思路 Code 一本通评测 1373:鱼塘钓鱼(fishing) 题目 [题目描述] 有N个鱼塘排成一排(N<100),每个鱼塘中有一定数量的鱼,例如:N=5时,如下表: 鱼 ...

  4. acm的STL容器之队列篇 及 UVa 11292 - Dragon of Loowater 小根堆解法(贪心算法)

    2018-07-17 优先队列,即Priority Queues 1.简单介绍一下队列(介绍功能,不作分析) C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构. 1.back ...

  5. BZOJ 1619 [Usaco2008 Nov]Guarding the Farm 保卫牧场:dfs【灌水】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1619 题意: 给你一个n*m的地形图,位置(x,y)的海拔为h[x][y]. 一个山顶的定 ...

  6. 8-详解前缀树贪心算法N皇后问题

    一.何为前缀树?如何生成前缀树? 经典的前缀树:点上没有数据,如果有路就复用,没有路就新建. 前缀树点的结构: pass:代表这个点经过了多少次,根节点的pass代表有多少个字符串前缀为空,或者一共加 ...

  7. 弱校胡策 大逃亡(BFS灌水+二分答案)

    题目描述 给出数字 N(1<=N<=10000), (1<=x<=1000), Y(1<=Y<=1000) ,代表有N 个敌人分布一个 X 行 Y 列的矩阵上,矩形 ...

  8. Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov! E. Drazil Likes Heap(贪心+模拟)

    题目链接 思路:这个题就是阅读理解题,能理解题意的话应该是秒出的那种,着重解释一下题意. 题意是给定一棵完全二叉树(共2^h-1个结点),这个二叉树满足大顶堆的性质也就是父亲结点a[i]大于等于儿子结 ...

  9. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

最新文章

  1. 【实用总结】DOM节点className操作
  2. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
  3. 怎么计算一组数据的波动_数据分析(一):数据描述统计
  4. 理解和配置 Linux 下的 OOM Killer
  5. BZOJ1082: [SCOI2005]栅栏
  6. 哥的博客不是山寨,是公益
  7. 把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)
  8. 如何使用eclemma插件_如何集成和使用EclEmma插件来获得良好的Junit覆盖率
  9. 反射例子(配置文件)
  10. 作者:景志刚(1977-),男,现就职于中国人民银行征信中心数据部,主要研究方向为数据挖掘。...
  11. 李彦宏发布内部信:宣布升级百度“云+AI”战略
  12. 诚招基于B/S系统开发的.net程序员[上海徐汇区]
  13. cad填充图案乱理石_cad采矿制图时遇到问题的完美解决方法
  14. python培训 首选马哥教育
  15. 利用python和百度地图API实现数据地图标注
  16. 汤小丹计算机操作系统慕课版课后题答案第三章:处理机调度与死锁
  17. python词云图_Python快速生成词云图,这是最详细的教程,没有之一!
  18. Macmini 2012Late硬盘异响和Mac下设置apm
  19. Code Complete阅读笔记(二)
  20. windows功能_四款功能强大的windows软件,个个都是精品!

热门文章

  1. 软件工程概述-----RUP开发模式
  2. 数据库SQL语句UPDATE能否修改主码
  3. 迅雷批处理:漫画下载利器!(娘王下载为例)
  4. 知识:ubuntu硬盘挂载详细步骤:
  5. TextField及富文本框的用法
  6. Angular5.x多环境配置(开发环境、生产环境、测试环境)
  7. MATLAB 相机标定中标定板角点像素坐标系到世界坐标系的转换
  8. 什么是软件形式化方法
  9. Sublime的tab键失效
  10. 机器学习——VC维问题