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