vijos p1777 引水入城 bfs 貪心

2022-06-02 07:06:08 字數 2671 閱讀 9833

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

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

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

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

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

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

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

2 5

9 1 5 4 3

8 7 6 1 2

copy

1

1

copy

每個測試點1s

本題共有10個測試資料,每個資料的範圍如下表所示:

測試資料編號 能否滿足要求 n m

1 不能 ≤ 10 ≤ 10

2 不能 ≤ 100 ≤ 100

3 不能 ≤ 500 ≤ 500

4 能 = 1 ≤ 10

5 能 ≤ 10 ≤ 10

6 能 ≤ 100 ≤ 20

7 能 ≤ 100 ≤ 50

8 能 ≤ 100 ≤ 100

9 能 ≤ 200 ≤ 200

10 能 ≤ 500 ≤ 500

對於所有的10個資料,每座城市的海拔高度都不超過10^6。

noip2010提高組複賽

做實驗室訓練賽的時候唯一沒做出來的題。。雖然我想到了這個貪心策略但是由於出題人題面有點問題所以沒有寫orz。

首先我們對每個點做個bfs或dfs就能得出最終最後一行是否完全被覆蓋。關鍵在於第二個問題:怎麼讓蓄水站最少?

建立在最後一行可以被完全覆蓋的基礎上,我們發覺每個蓄水站的可達區域是乙個底邊為沙漠邊的大塊。因此通過腦補我發覺第一行每個位置的蓄水站能覆蓋的最後一行的城市肯定是連續的一段。通過反證法可以證明這個論點。

然後對於蓄水站最少這個問題,我們就轉化成了怎樣用最少的線段來覆蓋整條線段。

這個是乙個經典問題,鑑於500的量直接排序完貪一波,不虧。

1 #include2

#define clr(x) memset(x,0,sizeof(x))

3#define clr_1(x) memset(x,-1,sizeof(x))

4#define ll long long

5#define inf 0x3f3f3f3f

6#define mod 000000007

7#define next nexted

8using

namespace

std;

9const

int n=5e2+10;10

int dirx[4]=;

11int diry[4]=;

12int

gmap[n][n];

13bool

inf[n][n];

14bool

tag[n];

15int

n,m,k,ans,lt,rt,mx,p;

16struct

seg17

segt[n];

20struct

pos21

now,next;

24 queueque;

25bool cmp(seg &a,seg &b)

2630

void bfs(int

tg)31

48for(int i=0;i<4;i++)

4957}58

}59 segt[tg].l=lt;

60 segt[tg].r=rt;

61return;62

}63intmain()

6485 sort(segt+1,segt+m+1

,cmp);

86 lt=segt[1

].l;

87 rt=segt[1

].r;

88 ans=1

;89 p=1;90

while(rt

91103

}104 ++ans;

105 lt=segt[p].l;

106 rt=segt[p].r;

107}

108 printf("

1\n%d\n

",ans);

109}

110return0;

111 }

view code

VIJOS P1777引水入城

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

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