NOIP2010 引水入城

2021-07-10 20:51:03 字數 2373 閱讀 2313

4引水入城在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。

為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水幫浦將湖泊中的水抽取到所在城市的蓄水池中。

因此,只有與湖泊毗鄰的第1 行的城市可以建造蓄水廠。而輸水站的功能則是通過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。由於第n 行的城市靠近沙漠,是該國的乾旱區,所以要求其中的每座城市都建有水利設施。那麼,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求乾旱區中不可能建有水利設施的城市數目。

輸入格式:

輸入檔案的每行中兩個數之間用乙個空格隔開。輸入的第一行是兩個正整數n 和m,表示矩形的規模。接下來n 行,每行m 個正整數,依次代表每座城市的海拔高度。

輸出格式:

輸出有兩行。如果能滿足要求,輸出的第一行是整數1,第二行是乙個整數,代表最少建造幾個蓄水廠;如果不能滿足要求,輸出的第一行是整數0,第二行是乙個整數,代表有幾座乾旱區中的城市不可能建有水利設施。

輸入樣例#1:

【輸入樣例1】
2 5
9 1 5 4 3
8 7 6 1 2
【輸入樣例2】
3 6
8 4 5 6 4 4
7 3 4 3 3 3
3 2 2 1 1 2
輸出樣例#1:

【輸出樣例1】
1
1
【輸出樣例2】
1
3
【樣例1 說明】

只需要在海拔為9 的那座城市中建造蓄水廠,即可滿足要求。

【樣例2 說明】

上圖中,在3 個粗線框出的城市中建造蓄水廠,可以滿足要求。以這3 個蓄水廠為源頭

在乾旱區中建造的輸水站分別用3 種顏色標出。當然,建造方法可能不唯一。

【資料範圍】

【思路】

dfs+dp。

首先根據dfs可以知道在第一行每個點建造蓄水廠可以到達的最後一行的點,而且可以證明可到達點一定是連續的。

證明:如果不連續那麼一定有另乙個點b可以到達本點a不能到達的地方,那麼兩個點的路徑一定會有乙個交點,a就一定可以通過這個交點到達所謂不能到達的地方,所以假設不成立。

這樣問題就變成了給出m條線段求出覆蓋1..m所需要的最少線段數,可以用dp求解。

【**】

#include#include

#include

#include

using

namespace

std;

const

int dx=;

const

int dy=;

struct

node;

intn,m;

intans;

bool fla=0

;bool bo[501

];bool flag[501][501

];int f[501

];int h[501][501

];int l[501],r[501

];void dfs(int,int,int

);int

main()

int sum=0

;

for(int i=1;i<=m;i++)

for(int i=1;i<=m;i++)

}if(fla)

else printf("

1\n"

);

for(int i=1;i<=m;i++)

}printf("%d

",f[m]);

}void dfs(int s,int x,int

y)

int h=h[x][y];

flag[x][y]=1

;

if(x1][y]1][y]) dfs(s,x+1

,y);

if(x>1 && h[x-1][y]1][y]) dfs(s,x-1

,y);

if(y1]1]) dfs(s,x,y+1

);

if(y>1 && h[x][y-1]1]) dfs(s,x,y-1

);}

NOIP2010 引水入城

兩遍bfs floodfill,第一遍bfs可以判斷出最後是輸出0還是輸出1,第二遍bfs floodfill不懂 program flow const dx array 1.4 of 1.1 1,0,1,0 dy array 1.4 of 1.1 0,1,0,1 type atp record x...

NOIP 2010 引水入城

題目描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政 區劃十分特殊,剛好構成乙個n行m列的矩形,如上圖所示,其中每個格仔都代表一座城 市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施 有兩種,分別為蓄水廠和輸...

NOIP2010 引水入城

模擬考試的時候因為前面的題耗時太嚴重,所以沒有寫 對於第一行的每乙個城市。我們能夠預處理出在這座城市建立蓄水廠,水流能到達最以下一行的哪些城市 假設終於的題目是有解的,那麼最後一行這些被覆蓋的城市是連續的。反證 假設水流到達最以下一行的城市是斷開不連續的,則說明中間有城市海拔比四周都高,其它城市過來...