The Wedding Juicer
poj2227:http://poj.org/problem?id=2227
题意:给你一块矩形区域,这个矩形区域是由一个个方格拼起来的,并且每个方格有一个高度。现在给这个方格灌水,问最多能装多少水。例如
555
525
555
这个区域,只有中间的一个方格能装水,因为只有中间的高度比周围都低,所以能装3单位的水。
题解:一开始自己也不不知道怎么做,看了黑书p89的介绍才知道怎么做。是这样的,从边界周围的最低处入手,DFS,如果周围的方格比这个高度高,则把这个方格加入最小堆中,如果比这个小,则继续DFS。同时要注意边界的处理。这样一来,每次DFS,都能确定新的边界,并且每次都是从已知边界的最小处进行DFS。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int used[][];
int g[][];
long long sum,counts,counts2;
int n,m;
struct Node{
int x;
int y;
int h;
bool operator<(const Node b)const{
return h>b.h;
}
};
priority_queue<Node>Q;
void DFS(int x,int y,int h){
if(x+<n&&!used[x+][y]){
used[x+][y]=;
if(g[x+][y]>=h){
Node tt;
tt.x=x+;tt.y=y;tt.h=g[x+][y];
Q.push(tt);
}
else {
counts+=g[x+][y];
counts2++;
DFS(x+,y,h);
}
}
if(x->&&!used[x-][y]){
used[x-][y]=;
if(g[x-][y]>=h){
Node tt;
tt.x=x-;tt.y=y;tt.h=g[x-][y];
Q.push(tt);
}
else {
counts+=g[x-][y];
counts2++;
DFS(x-,y,h);
}
}
if(y+<m&&!used[x][y+]){
used[x][y+]=;
if(g[x][y+]>=h){
Node tt;
tt.x=x;tt.y=y+;tt.h=g[x][y+];
Q.push(tt);
}
else {
counts+=g[x][y+];
counts2++;
DFS(x,y+,h);
}
}
if(y->&&!used[x][y-]){
used[x][y-]=;
if(g[x][y-]>=h){
Node tt;
tt.x=x;tt.y=y-;tt.h=g[x][y-];
Q.push(tt);
}
else {
counts+=g[x][y-];
counts2++;
DFS(x,y-,h);
}
}
}
int main(){
while(~scanf("%d%d",&m,&n)){
memset(used,,sizeof(used));
sum=;
while(!Q.empty())Q.pop();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d",&g[i][j]);
if(i==||i==n||j==||j==m){
Node tt;
tt.x=i;tt.y=j;tt.h=g[i][j];
Q.push(tt);
}
}
while(!Q.empty()){
Node ttt=Q.top();
Q.pop();
int xxx=ttt.x;
int yyy=ttt.y;
int hhh=ttt.h;
counts=;counts2=;
used[xxx][yyy]=;
DFS(xxx,yyy,hhh);
sum+=counts2*hhh-counts;
}
printf("%I64d\n",sum);
}
}
The Wedding Juicer的更多相关文章
- BZOJ1736 [Usaco2005 jan]The Wedding Juicer 婚宴的榨汁机
从外面一点一点往里面拓展(floodfill),每次找出最小的一个点,计算它对答案的贡献就好了... 找最小的点的话,直接pq就行 /********************************* ...
- POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)
思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...
- USACO 2005 January Gold The Wedding Juicer
题目 题目链接,我只在poj上找到了题目,usaco居然上不去. 大意就是说有一些\(1\times 1\times 1\)的小方块堆在一起,问最多能装多少水. 我们在一次测试中出了这题,由于我写水题 ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- bzoj usaco 金组水题题解(2.5)
bzoj 2197: [Usaco2011 Mar]Tree Decoration 树形dp..f[i]表示处理完以i为根的子树的最小时间. 因为一个点上可以挂无数个,所以在点i上挂东西的单位花费就是 ...
- BZOJ-USACO被虐记
bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...
- POJ2227(优先队列)
The Wedding Juicer Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3440 Accepted: 155 ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- bzoj Usaco补完计划(优先级 Gold>Silver>资格赛)
听说KPM初二暑假就补完了啊%%% 先刷Gold再刷Silver(因为目测没那么多时间刷Silver,方便以后TJ2333(雾 按AC数降序刷 ---------------------------- ...
随机推荐
- Node.js小Httpserver
须要说明两点: 1 程序文件hello.js需用记事本另存为utf-8格式的hello.js watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVhcGVk ...
- Python读写文件需要注意的地方 2015-03-31 23:19 69人阅读 评论(0) 收藏
<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"> ...
- vim 语法高亮
1 .配置文件的位置 在文件夹 /etc/ 以下.有个名为vimrc 的文件.这是系统中公共的vim配置文件.对全部用户都有效.而在每一个用户的主文件夹下,都能够自己建立私有的配置文件,命名为:&qu ...
- UVA10972 - RevolC FaeLoN(双连通分量)
题目链接 题意: 给定一个无向图,问最少加入多少条边,使得这个图成为连通图 思路:首先注意题目给出的无向图可能是非连通的,即存在孤立点.处理孤立点之后.其它就能够当作连通块来处理.事实上跟POJ335 ...
- LCA在线算法ST算法
求LCA(近期公共祖先)的算法有好多,按在线和离线分为在线算法和离线算法. 离线算法有基于搜索的Tarjan算法较优,而在线算法则是基于dp的ST算法较优. 首先说一下ST算法. 这个算法是基于RMQ ...
- PHP利用超级全局变量$_GET来接收表单数据。
我们在linux上用 touch php_get.html php_get.php创建两个文件. php_get.html文件的代码如下: <!doctype html> <html ...
- python 学习笔记(二)两种方式实现第一个python程序
在交互模式下: 如果要让Python打印出指定的文字,可以用print语句,然后把希望打印的文字用单引号或者双引号括起来,但不能混用单引号和双引号: >>> print 'hello ...
- Android开发手记(29) 基于Http的LaTeX数学公式转换器
本文将讲解如何通过codecogs.com和Google.com提供的API接口来将LaTeX数学函数表达式转化为图片形式.具体思路如下: (1)通过EditText获取用户输入的LaTeX数学表达式 ...
- 在eclipse下面搭建Clojure开发运行环境
打开eclipse,点击菜单栏“help->Install New Software...", 然后,点击”add“, 在Location处输入 http://ccw.cgrand.n ...
- 解决右滑返回手势和UIScrollView中的手势冲突
当在一个viewController中添加了scrollView或者tableView的时候,贴边侧滑返回的时候会首先触发滚动而失效,要解决这个问题,需要通过requireGestureRecogni ...