LUOGU P1514 引水入城 bfs

2022-05-12 10:27:22 字數 1028 閱讀 8667

傳送門

解題思路

拉了很長的戰線,換了好幾種寫法終於過了。。首先每個蓄水場一定是對沙漠造成連續一段的貢獻,所以可以$bfs$出每種狀態,然後做一次最小區間覆蓋,但這樣的複雜度有點高。就每次只搜那些比左右高的點。

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 505

;const

int inf = 0x3f3f3f3f

;inline

intrd()

while(isdigit(ch))

return f?x:-x;

}int xx[4]=,yy[4]=;

intn,m,cnt,h[maxn][maxn],ans,num,t;

int vis[maxn][maxn];bool

b[maxn];

queue

q[3

];struct

data

}data[maxn];

void bfs(int x,int

y)

for(register int k=0;k<=3;k++)

q[1].push(ii);q[2

].push(jj);}}

//if(data[cnt].l==inf) cnt--;

//cout

intmain()

sort(data+1,data+1+cnt);int now=0;data[cnt+1].l=inf;

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

now=mx;num++;i=p-1

; }

puts("1

"),printf("%d"

,num);

return0;

}

view code

LuoguP1514引水入城(搜尋 dp)

題目如上 非常非常巧妙的一道題目 1.先思考,要求的是什麼?如題目所說,目的是要把第n排全部建上那個什麼水利工程,全建上,也就是全部覆蓋!再考慮起點,也就是河岸,動動筆,也不難發現,某些節點可以拓展到終點的一片區域,如樣例一中9可以拓展到的點如圖所示,綠色的框則表示9,也就是入口第一列的這個點所能到...

P1514 引水入城

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

luogu1514 引水入城

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