題解 P1034 矩形覆蓋

2022-02-27 08:22:58 字數 1320 閱讀 9233

在平面上有n個點(n≤50),每個點用一對整數座標表示。例如:當n=4時,4個點的座標分另為:p1(1,1),p2(2,2),p3(3,6),p4(0,7),見圖一。

這些點可以用k個矩形(1≤k≤4)全部覆蓋,矩形的邊平行於座標軸。當k=2時,可用如圖二的兩個矩形s1,s2覆蓋,81,s2面積和為4。問題是當n個點座標和k給出後,怎樣才能使得覆蓋所有點的k個矩形的面積之和為最小呢?

約定:覆蓋乙個點的矩形面積為0;覆蓋平行於座標軸直線上點的矩形面積也為0。各個矩形必須完全分開(邊線與頂點也都不能重合)。

有n個點,找k個矩形包含所有點,使k個矩形和面積和最小。

這道題剛拿到手裡的時候是挺棘手的,但是我們看資料範圍的大小,是可以暴力列舉的,所以我們可以嘗試一下暴力列舉。

maps用來存圖

ss用來存構建的矩形

struct maps

p[5];

judge函式列舉四種不成立的情況

in函式判斷範圍,便於書寫judge函式

bool in(ss a, int x, int y)

bool judge(ss a, ss b)

構建好m個矩形

計算面積和

每次存最小值

搜完結束

void dfs(int num)

value+=(p[i].r-p[i].l)*(p[i].u-p[i].d);

}if (value>=ans) return;

if (num>n)

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

else }}

#include#includeusing namespace std;

struct maps

p[5];

int n,m,ans=0x7f7f7f7f;

bool in(ss a, int x, int y)

bool judge(ss a, ss b)

void dfs(int num)

value+=(p[i].r-p[i].l)*(p[i].u-p[i].d);

}if (value>=ans) return;

if (num>n)

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

else

}}int main(void)

P1034 矩形覆蓋

在平面上有nn個點 n le 50n 50 每個點用一對整數座標表示。例如 當 n 4n 4 時,44個點的座標分另為 p 1p1 1,11,1 p 2p2 2,22,2 p 3p3 3,63,6 p 4p4 0,70,7 見圖一。這些點可以用kk個矩形 1 le k le 41 k 4 全部覆蓋,...

P1034 矩形覆蓋

在平面上有 n 個點 n 50 每個點用一對整數座標表示。例如 當 n 4 時,4個點的座標分另為 p1 1,1 p2 2,2 p3 3,6 p4 0,7 見圖一。這些點可以用 k 個矩形 1 k 4 全部覆蓋,矩形的邊平行於座標軸。當 k 2 時,可用如圖二的兩個矩形 sl,s2 覆蓋,s1,s2...

洛谷P1034矩形覆蓋

據說是dp,所以我用dfs,居然a了,資料真水 說說思路,我們要求覆蓋所有點且不能重疊,顯然我們要從點入手,我們可以列舉每個點被哪個矩形重疊,因為如果列舉矩形覆蓋點的話,貌似不可做,具體怎麼實現呢?最好小夥伴們手動畫個圖,一下就明白了,列舉每個點被哪個矩形覆蓋,那麼必然是要根據點的座標來調整矩形的位...