原題:
題意:
n*m的數字矩陣代表各個點的海拔,你可以在第一行的某些位置打井,水會流向海拔嚴格低的點,問最少打幾個井可以使最後一行都有水。
解析:
首先當然是對於第一行的每個點按照海拔進行dfs
如果第一行的某個點被其他點dfs到了,說明這個點是沒必要打井的。
如果有某個最後一行的點在所有dfs中都沒有被遍歷到,則不行。
重要點:在最後一行點都可以流到的情況下,對於第一行的某個點的dfs,其到達的最後一行的點,一定是連續的。即到達了mp[
m][x
]mp[m][x]
mp[m][
x]和m p[
m][y
]mp[m][y]
mp[m][
y],那麼一定可以到達mp[
m][x
<
i mp[m][xmp [m][ x< i。所以求出每個點管轄的區間,最後直接貪心即可。#include
using namespace std;
const
int di[4]
[2]=
,,,}
;int n, m;
int mp[
505]
[505];
bool vis[
505]
[505];
bool out[
505]
;bool in[
505]
;int l[
505]
, r[
505]
;void
dfs(
int x,
int y)
}int
main()
}for
(int i =
1; i <= m; i++)}
int cant =0;
for(
int i =
1; i <= m; i++)if
(cant)
return0*
printf
("0\n%d\n"
, cant)
;int now =
0, ans =
0, id =0;
while
(now < m)
} id = nex, now = ma, ans++;}
printf
("1\n%d\n"
, ans)
;}
P1514 引水入城
先用dfs搜尋,從最上面的一行往下拓展,所有點拓展完後,掃瞄最後一行是否有沒被染上色的,有則說明 不能滿足要求 如果沒有,在用dfs,計算出最上面一行的每個點 大於等於兩邊的點 能拓展到的最左端和最右端,然後就轉化成了區間覆蓋問題。區間覆蓋問題是給你幾個區間,然後給你乙個大區間,用盡量少的小區間來覆...
P1514 引水入城
在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠...
P1514 引水入城
在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠...