NOIP 2010 引水入城

2021-07-14 08:32:22 字數 1826 閱讀 5166

題目描述:

在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政 區劃十分特殊,剛好構成乙個n行m列的矩形,如上圖所示,其中每個格仔都代表一座城 市,每座城市都有乙個海拔高度。 為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施 有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水幫浦將湖泊中的水抽取到所在城市的 蓄水池中。因此,只有與湖泊毗鄰的第1行的城市可以建造蓄水廠。而輸水站的功能則是通 過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是 存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。 由於第n行的城市靠近沙漠,是該國的乾旱區,所以要求其中的每座城市都建有水利 設施。那麼,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求幹 旱區中不可能建有水利設施的城市數目。

輸入描述:

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

輸出描述:

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

樣例輸入:

2 5

9 1 5 4 3

8 7 6 1 2

樣例輸出:1 1

演算法使用:深度優先搜尋+動態規劃

思路:

先利用搜尋判斷問題有無解。

預處理:

對於第一行的點通過搜尋求出它能到達的最後一行的所有的點,那麼這些點一定是連續的。證明:如果最後一行的這些點不是連續的設中間不能到達的點為x,則x的高度一定大於它左邊,右邊,上邊的點的高度,這與有解的情況是矛盾的。所以就可以求出第一行的點對應最後一行的區間,並記錄下左右區間。所以問題轉換為了線段覆蓋型的動歸。

#include

using

namespace

std;

const

int maxn=501;

int n,m,num,map[maxn][maxn],f[maxn];

int xx[5]=,

yy[5]=;

bool flag[maxn][maxn],k[maxn];

struct node

a[maxn][maxn];

void dfs(int i,int j)//深搜判斷有無解,計算第一行的點對應的區間

}}int main()

for(int i=1;i<=m;i++)//深搜第一行的點

dfs(1,i);

for(int i=1;i<=m;i++)//根據深搜判斷有無解

if(k[i]==false) num++;

if(num!=0)

f[0]=0;//動態規劃

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

for(int j=a[1][i].l;j<=a[1][i].r;j++)

if(f[j]>f[a[1][i].l-1]+1||!f[j])

f[j]=f[a[1][i].l-1]+1;

cout

<

0;}

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...

NOIP2010 引水入城

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

NOIP2010 引水入城

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