引水入城 NOI2010

2022-02-03 11:43:50 字數 2929 閱讀 6752

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

為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水幫浦將湖泊中的水抽取到所在城市的蓄水池中。因此,只有與湖泊毗鄰的第1行的城市可以建造蓄水廠。而輸水站的功能則是通過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。

由於第n行的城市靠近沙漠,是該國的乾旱區,所以要求其中的每座城市都建有水利設施。那麼,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求乾旱區中不可能建有水利設施的城市數目。

輸入檔名為flow.in。輸入檔案的每行中兩個數之間用乙個空格隔開。

輸入的第一行是兩個正整數n和m,表示矩形的規模。

接下來n行,每行m個正整數,依次代表每座城市的海拔高度。

輸出檔名為flow.out。

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

輸入輸出樣例1】

flow.in

2 59 1 5 4 3

8 7 6 1 2

flow.out11

【樣例1說明】

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

【輸入輸出樣例2】

flow.in

3 68 4 5 6 4 4

7 3 4 3 3 3

3 2 2 1 1 2

flow.out13

【樣例2說明】 

湖泊 8 4 5 6 4 4 

7 3 4 3 3 3 

3 2 2 1 1 2 

沙漠

上圖中,在3個粗線框出的城市中建造蓄水廠,可以滿足要求。以這3個蓄水廠為源頭在乾旱區中建造的輸水站分別用3種顏色標出。當然,建造方法可能不唯一。 

【資料範圍】 

一堆大搜尋= =深搜寬搜暴搜各種搜。成績沒有前天那麼慘,但是也不是特別好。後半段調第四題莫名卡死的深搜花了很長時間,到後來覺得有點懊喪完全是浪費時間。然後回來看其他題,打了幾個不知所云的優化,也沒有本質上改變效率。前半段還是非常不錯的,前兩題也覺得做得差不多。考試次數雖然多,但還沒有變得麻木,依然每次都是需要勇氣的冒險。

一道看起來很可做但是被我想麻煩了的題,正解是dfs/bfs+貪心。因為沒有想到它覆蓋的區間一定是連續的,考試的時候打了兩個dfs,實現起來其實很困難,用了三個vector來正搜反搜。後來回來優化,覺得佇列或許要比動態陣列快一些,就把其中乙個改成了佇列,親測佇列比vector多過了乙個點(總共只過了乙個點qaq)。弄明白了只要能完全覆蓋就一定是線段,這就是乙個顯而易見的貪心了,從左往右掃覆蓋區間選最優即可。不知道為什麼沒有標記的dfs會超時,有標記的dfs搜不出正確答案,逼得我一樣的dfs有標記無標記做了兩次,第一次判斷有無解,有解則用第二次處理覆蓋區間;不過居然很快?!考試的時候往往想不到貪心,即使用了也意識不到自己在打貪心,看來這種思想還要更強化一下。一道題能用貪心來做,往往可以節省很多時間和**量,不過貪心的可行性是需要謹慎檢驗的。

#include#include

#include

#include

using

namespace

std;

const

int sj=510

;int

n,m,hb[sj][sj],ans,mi,ma,e,ge;

bool

kd[sj],jg[sj][sj];

inline

intr()

return

jg;}

void bj(int &x,int

y)void db(int &x,int

y)struct

tt[sj];

int comp(const t&a,const t&b)

void dfs1(int y,int

x)

if(hb[y][x]>hb[y+1][x]) dfs1(y+1

,x);

if(hb[y][x]>hb[y-1][x]) dfs1(y-1

,x);

if(hb[y][x]>hb[y][x+1]) dfs1(y,x+1

);

if(hb[y][x]>hb[y][x-1]) dfs1(y,x-1);}

void dfs2(int y,int

x)int

main()

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

if(hb[1][i]>=hb[1][i+1]&&hb[1][i]>=hb[1][i-1

])

}sort(t+1,t+e+1

,comp);

int yd,temp=0

; yd=t[1

].ri;

ans=1

;

for(int i=2;i<=e;i++)

}if(yd

ans++;

printf(

"1\n%d

",ans);

return0;

}

引水入城 noip2010

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

NOI2010全程日記

7.31 day1 從七月30 號開始坐車 硬座啊 經過了十四個小時的煎熬 終於到達了煙台 車上空調很冷 差點凍感冒了。然後就到了這個學校,先吃早飯,然後報道。不得不說 ccf效率依然很低,半天過去乙個人,終於到了我們啊。今年發了乙個包,乙個珊瑚的模型,一件背心印有 ccf noi 的,夏令營和省隊...

NOI2010 超級鋼琴

傳送門 這個題有趣。巧妙地利用st表和堆 首先最暴力的我就不說了 第二個暴力就是主席樹 堆,預計得分70 80,時間o klog 2n std是用堆儲存可能的區間,然後用st表查詢區間最小值 因為其實如果知道區間右端點,再處理個字首和s 那麼就只要查詢區間最小值就可以了,可以st表o 1 做 inc...