水 water 積水問題 蓄水問題

2021-07-27 03:49:07 字數 1720 閱讀 6710

【題目描述】

有一塊矩形土地被劃分成 n×m 個正方形小塊。這些小塊高低不平,每一小塊都有自己的高度。水流可以由任意一塊地流向周圍四個方向的四塊地中,但是不能直接流入對角相連的小塊中。

一場大雨後,由於地勢高低不同,許多地方都積存了不少降水。假如你已經知道這塊土地的詳細資訊,你能求出每個小塊的積水高度嗎?

注意:假設矩形地外圍的高度為 0。

【輸入格式】
第一行包含兩個非負整數 n,m。

接下來 n 行每行 m個整數表示第 i 行第 j 列的小塊的高度。

【輸出格式】
輸出 n 行,每行 m個由空格隔開的非負整數,表示每個小塊的積水高度。
【樣例輸入】
3 3

4 4 0

2 1 3

3 3 -1

【樣例輸出】
0 0 0

0 1 0

0 0 1

【資料範圍】
對於 20%的資料 n,m<=4

對於 40%的資料 n,m<=15

對於 60%的資料 n,m<=50

對於 100%的資料 n,m<=300 小塊高度的絕對值<=10^9

在每一部分資料中,均有一半資料保證小塊高度非負

1:將負數坑填平;因為最外面一圈是0,所以可以隨便填

2:將最外面一圈(1~m,1~n之間)的點加到小根堆中

3:取出堆頂從堆頂連的四個方向灌水,如果碰見不比它低的點,將其入堆,否則向其中灌水,說明:ans[i][j]+=h-map[i][j]的原因是之前填了負數坑,如果全部資料為正數,則直接ans[i][j]=h-map[i][j]即可

4:輸出結果

具體問題看**

附:stl priority_queue

#include

#include

#include

#define inf 0x7fffffff;

using

namespace

std;

struct data

int x,y,v;

};int u[4]=,v[4]=;

int minn,minx,miny;

priority_queueque;

int n,m,ss;

intmap[500][500],ans[500][500];

bool pd[500][500];

void pre()

for(j=2;j0;in.y=j;

in.v=map[0][j];pd[0][j]=1;

que.push(in);

in.x=n;in.y=j;

in.v=map[n][j];pd[n][j]=1;

que.push(in);

}}bool inmap(data a)

void fill(data z,int h)

ans[xx][yy]+=h-map[xx][yy];

for(i=0;i<4;i++)

}}void solve()}}

}void out()

printf("\n");

}}int main()

}pre();

solve();

out();

return

0;}

排隊打水問題(water)

有n個人排隊到m個水龍頭去打水,他們裝滿水桶的時間t1,t2 tn為整數且各不相同,應如何安排他們的打水順序才能使他們花費的總時間最少?只有一組輸入資料哦。4 2 n m 2 6 4 5 t1 t2 tn 23 所有人的花費時間總和 int a maxn 接水的人 int b maxn 等待接水的時...

演算法 蓄水問題

問題 給定乙個陣列,想象成乙個桶。問最多能裝多少水?例 1,5,3,6 最多裝2格水 oo o o o o o o o o o o o o o 解題思路 我們把每一列當成一塊板,根據分析,第一塊板和最後一塊板一定不能蓄水,所以問題變成了所有板所能蓄水最大值的總和。先明確這個思路,之後再想辦法。那麼如...

坦克問題與蓄水問題

問題1 某次戰役中,為便於資訊互動,我軍偵察部門將此次戰役的關鍵高地座標設定為 x 0,y 0 並規定,每向東增加100公尺,x加1,每向北增加100公尺,y加1。同時,我軍情報部門也破譯了敵軍向坦克傳送的指揮訊號,其中有三種訊號 l,r,m 用於控制坦克的運動,l 和 r 分別表示使令坦克向左 向...