P1514 引水入城(矩陣搜尋 技巧)

2021-09-10 08:11:57 字數 1374 閱讀 2661

原題:

題意:

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 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠...