引水入城 noip2010

2021-07-05 21:50:48 字數 2605 閱讀 6699

題目描述 description

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

輸入描述 input description

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

輸出描述 output description

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

樣例輸入 sample input

2 59 1 5 4 3

8 7 6 1 2

樣例輸出 sample output

1題目要求的結果共有兩種情況,一種是在底部不能夠全部連通的情況輸出不能連通的城市數,第二種是在連通的情況下用在頂部用最少的蓄水站將底部灌滿

對於不同的情況,則需要進行一次灌水來進行判斷

那麼:何為灌水呢

個人的理解是這樣,對於圖上的處理,就像實際中一樣,將水流從高度高的位置向四周較低的位置蔓延覆蓋,然後將其覆蓋到底位置染色

程式實現就是從當前點開始,向四周遍歷,將高度比當前點低的點入隊,重複操作處理整個圖

對於這道題,從頂部向下灌水遍歷,將底部染色(標個號)

如果全部遍歷一遍後底部仍有未被染色的,那麼這種情況便是不連通的

如果連通呢

對於頂部每乙個可建蓄水站的城市,如果在這座城市建蓄水站的話,則將在底部沙漠中獲得一段可覆蓋的連續區間:乙個可被覆蓋的底部沙漠城市只可被其左邊,右邊,上邊的城市灌水(x,y+1||x,y-1||x-1,y)如果左右兩邊的城市被淹沒的話,則該城市必被淹沒,如果不能,也不會存在另外的點能夠經過其周圍的三個點淹沒這座城市,所以淹沒的城市必是一段連續的區間

證明這一點之後,每座頂部的蓄水站都會有一段覆蓋底部城市的區間

由於底部一定會被這些區間完全覆蓋,於是問題就轉化成了盡量用少的已知區間覆蓋整個底部區間,答案就是所使用的區間個數

於是問題的難點就轉化成了線段覆蓋!

這個地方比較正常的做法是dp== 但是仔細一想貪心是完全成立的:

將所有的線段(區間)全部按照右端點從大往小,左端點從小往大雙關鍵字排序。

第一條線段必定選(右端點最靠右的線段中左端點最靠左),那麼從此之後的線段選擇的條件為:右端點必須在已覆蓋的區間內,左端點超出已覆蓋區間的長度最長

處理完所有的線段後,既是用最少的線段完成了整個區間的覆蓋

最後輸出已選線段個數就完成了

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=233333;

intmap[510][510];

bool use[maxn];

struct doubinum[maxn];

bool cmp(doubi a,doubi b)

int ans;

int n,m;

int x_x[5]=;

int y_y[5]=;

struct faq;

queue

q;bool can(int x,int y)

return

false;

}bool fa[800][800];

void bbfs(int u,int j)

for(int i=1;i<=4;i++)}}

}bool check()

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

return

true;

}void bfs(int u)

for(int i=1;i<=4;i++)}}

}bool vis[maxn];

int main()

}if(!check())

}cout

0; }

else}}

}****cy:;

num[i].l=s,num[i].r=t;

}sort(num+1,num+m+1,cmp);

int now=0,to=0,tot=0;

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

if(now!=m)tot++;

cout

<}

}

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

NOIP 2010 引水入城

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