題意大致是:給定乙個(n,m)的數值矩陣,可以在第一行建造水庫,如果乙個格仔周圍的某格仔值小於它,那水就可以流到它周圍的那個格仔,問需要在第一行建造多少水庫使得最後一行能夠被完全覆蓋,如果不能完全覆蓋就求出不能覆蓋的格仔的數量。
主要思路就是在第一行每個點出發的水能到達第n行的區間可以獲得(可以用反證法證明每個點出發的水如果能到達第n行那麼它的覆蓋區間一定是連續的),如果能夠完全覆蓋第n行則用最小區間數覆蓋可以求出最少需要多少個點可以覆蓋第n行,
**如下:
1 #include2using
namespace
std;
3 typedef unsigned int
ui;4 typedef long
long
ll;5 typedef unsigned long
long
ull;
6#define pf printf
7#define mem(a,b) memset(a,b,sizeof(a))
8#define prime1 1e9+7
9#define prime2 1e9+9
10#define scand(x) scanf("%llf",&x)
11#define f(i,a,b) for(int i=a;i<=b;i++)
12#define scan(a) scanf("%d",&a)
13#define dbg(args) cout<<#args<<":"<14
#define pb(i) push_back(i)
15#define ppb(x) pop_back(x)
16#define inf 0x3f3f3f3f
17#define maxn 1005
18int
n,m,t,a[maxn][maxn],l[maxn][maxn],r[maxn][maxn],vis[maxn][maxn];
19//
l[i][j]從(i,j)位置出發的水最多能覆蓋到最後一行的左端的位置,
20//
r[i][j]從(i,j)位置出發的水最多能覆蓋到最後一行的最右端的位置
21int dir[2]=,,,};
22void dfs(int x,int
y)23
36 l[x][y]=min(l[x][y],l[xx][yy]);
37 r[x][y]=max(r[x][y],r[xx][yy]);38}
39}40int
main()
4152
mem(l,inf);
53 mem(r,-inf);
54 f(1,1
,m)55
58 f(i,1
,m)59
63bool flag=true;64
int cnt=0
;65 f(i,1
,m)6672}
73if(!flag)
7477
else
7889 left=maxr+1
;90 num++;
91}
92 pf("
1\n%d\n
",num);
93/*
f(i,1,m)
94*/97}
98return0;
99 }
洛谷 1514 引水入城
題目描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行 n m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水廠...
洛谷 P1514 引水入城(記憶化搜尋 貪心)
傳送門 題目描述 在乙個遙遠的國度,一側是風景秀美的湖泊,另一側則是漫無邊際的沙漠。該國的行政區劃十分特殊,剛好構成乙個n 行m 列的矩形,如上圖所示,其中每個格仔都代表一座城市,每座城市都有乙個海拔高度。為了使居民們都盡可能飲用到清澈的湖水,現在要在某些城市建造水利設施。水利設施有兩種,分別為蓄水...
洛谷P1514 引水入城 記憶化搜尋 線段覆蓋
題目大意 n m個城市,要求在最後一行的乾旱區所有城市中建設水利設施。水利設施有兩種,一種為蓄水廠,一種為輸水站。第一行城市由於沿海,可以建設蓄水廠。某城市建輸水站的要求是相鄰 上下左右 且高度比自己高的城市建有水利設施 利用高度差輸水 如果可以全部建成,則輸出最少要建幾個蓄水廠。否則輸出乾旱區中不...