P1514 引水入城 DFS

2022-05-01 16:27:08 字數 3190 閱讀 6544

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

為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠和輸水站。蓄水廠的功能是利用水幫浦將湖泊中的水抽取到所在城市的蓄水池中。

因此,只有與湖泊毗鄰的第11 行的城市可以建造蓄水廠。而輸水站的功能則是通過輸水管線利用高度落差,將湖水從高處向低處輸送。故一座城市能建造輸水站的前提,是存在比它海拔更高且擁有公共邊的相鄰城市,已經建有水利設施。由於第nn 行的城市靠近沙漠,是該國的乾旱區,所以要求其中的每座城市都建有水利設施。那麼,這個要求能否滿足呢?如果能,請計算最少建造幾個蓄水廠;如果不能,求乾旱區中不可能建有水利設施的城市數目。

輸入格式:

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

輸出格式:

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

輸入樣例#1: 複製

2 5

9 1 5 4 3

8 7 6 1 2

輸出樣例#1: 複製

1

1

輸入樣例#2: 複製

3 6

8 4 5 6 4 4

7 3 4 3 3 3

3 2 2 1 1 2

輸出樣例#2: 複製

1

3非常好的一道搜尋題目

貪心+dfs即可解決 這題dfs很簡單 主要是後期處理

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

#define n 5005

intn,m;

intmp[n][n];

intvis[n][n];

intvis2[n];

intri[n];

vector

node[n];//

該城市所到達的點

vectorin[n];//

到達該點的城市

bool inmap(int x,int

y)int dx=;

int dy=;

void dfs(int x,int y,int

flag)

rep(i,

0,3)

}struct

aaas[n];

bool

cmp(aaa a,aaa b)

intmain()

sort(s+1,s+1+m,cmp);//

貪心優化 高的先來 剪了30ms。。。

rep(i,

1,m)

if(!vis[1

][ s[i].id ])

dfs(

1,s[i].id,s[i].id);

int ok=1

;

int cnt=0

; rep(i,

1,m)

if(!vis2[i])ok=0,cnt++;

if(!ok)printf("

%d\n%d

",0,cnt);

else

cout

<

}return0;

}

view code

大佬的做法   速度比我的快一倍qaq

遞迴求左界和右界非常巧妙

#include #include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 510

#define nx x+xx[i]

#define ny y+yy[i]

intl[maxn][maxn],r[maxn][maxn];

inthigh[maxn][maxn];

intn,m;

bool

vis[maxn][maxn];

int xx[4]=;

int yy[4]=;

int qx[maxn*maxn],qy[maxn*maxn];

inline

void dfs(int x,inty)}

inline

intread()

return

ret;

}int

main()

if(flag)

int left=1

;

while (left<=m)

puts("1

");printf("%d

",cnt);

}

view code

P1514 引水入城

先用dfs搜尋,從最上面的一行往下拓展,所有點拓展完後,掃瞄最後一行是否有沒被染上色的,有則說明 不能滿足要求 如果沒有,在用dfs,計算出最上面一行的每個點 大於等於兩邊的點 能拓展到的最左端和最右端,然後就轉化成了區間覆蓋問題。區間覆蓋問題是給你幾個區間,然後給你乙個大區間,用盡量少的小區間來覆...

P1514 引水入城

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

P1514 引水入城

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