洛谷 P1034 矩形覆蓋 dfs

2022-05-07 22:51:28 字數 4062 閱讀 2670

可能是資料太水了瞎搞都可以過。

判斷兩個平行於座標軸的矩形相交(含頂點與邊相交)的**一併附上。

記得這裡的xy和udlr是指數學上的座標軸。

#includeusing

namespace

std;

#define ll long long

struct

point

}p[51

];struct

rectangle

bool

inside(point p)

bool

intersect_help(rectangle r2)

bool

intersect(rectangle r2)

intarea()

void

extend(point p)

else

}void

show()

};int

n,k;

int ans=0x3f3f3f3f

;void dfs4(int

id,rectangle r1,rectangle r2,rectangle r3,rectangle r4)

point pi=p[id];

if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))

dfs4(id+1

,r1,r2,r3,r4);

else

rectangle rr2=r2;

rr2.extend(pi);

if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))

;else

rectangle rr3=r3;

rr3.extend(pi);

if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))

;else

rectangle rr4=r4;

rr4.extend(pi);

if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))

;else

}}void dfs3(int

id,rectangle r1,rectangle r2,rectangle r3)

point pi=p[id];

if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))

dfs3(id+1

,r1,r2,r3);

else

rectangle rr2=r2;

rr2.extend(pi);

if(rr2.intersect(r1)||rr2.intersect(r3))

;else

rectangle rr3=r3;

rr3.extend(pi);

if(rr3.intersect(r1)||rr3.intersect(r2))

;else

}}void dfs2(int

id,rectangle r1,rectangle r2)

point pi=p[id];

if(r1.inside(pi)||r2.inside(pi))

dfs2(id+1

,r1,r2);

else

rectangle rr2=r2;

rr2.extend(pi);

if(rr2.intersect(r1))

;else

}}void dfs(int

id,rectangle r1)

point pi=p[id];

if(r1.inside(pi))

dfs(id+1

,r1);

else

}int

main()

rectangle r;

switch

(k) printf(

"%d\n

",ans);

}

加入最優性剪枝:22ms,快了3倍?

#includeusing

namespace

std;

#define ll long long

struct

point

}p[51

];struct

rectangle

bool

inside(point p)

bool

intersect_help(rectangle r2)

bool

intersect(rectangle r2)

intarea()

void

extend(point p)

else

}void

show()

};int

n,k;

int ans=0x3f3f3f3f

;void dfs4(int

id,rectangle r1,rectangle r2,rectangle r3,rectangle r4)

point pi=p[id];

if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi)||r4.inside(pi))

dfs4(id+1

,r1,r2,r3,r4);

else

rectangle rr2=r2;

rr2.extend(pi);

if(rr2.intersect(r1)||rr2.intersect(r3)||rr2.intersect(r4))

;else

rectangle rr3=r3;

rr3.extend(pi);

if(rr3.intersect(r1)||rr3.intersect(r2)||rr3.intersect(r4))

;else

rectangle rr4=r4;

rr4.extend(pi);

if(rr4.intersect(r1)||rr4.intersect(r2)||rr4.intersect(r3))

;else

}}void dfs3(int

id,rectangle r1,rectangle r2,rectangle r3)

point pi=p[id];

if(r1.inside(pi)||r2.inside(pi)||r3.inside(pi))

dfs3(id+1

,r1,r2,r3);

else

rectangle rr2=r2;

rr2.extend(pi);

if(rr2.intersect(r1)||rr2.intersect(r3))

;else

rectangle rr3=r3;

rr3.extend(pi);

if(rr3.intersect(r1)||rr3.intersect(r2))

;else

}}void dfs2(int

id,rectangle r1,rectangle r2)

point pi=p[id];

if(r1.inside(pi)||r2.inside(pi))

dfs2(id+1

,r1,r2);

else

rectangle rr2=r2;

rr2.extend(pi);

if(rr2.intersect(r1))

;else

}}void dfs(int

id,rectangle r1)

point pi=p[id];

if(r1.inside(pi))

dfs(id+1

,r1);

else

}int

main()

rectangle r;

switch

(k) printf(

"%d\n

",ans);

}

洛谷 P1034 矩形覆蓋(dfs)

有n個點k個矩陣,k個矩陣包含n個點,求這k個矩陣的最小面積 因為資料範圍很小,所以可以直接暴搜,求每個點可以存在矩陣的位置,利用幾次剪枝 因為資料太水,不剪也行 即可通過 include using namespace std define ll long long const int maxn ...

洛谷P1034矩形覆蓋

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

搜尋 洛谷P1034 矩形覆蓋

然後就知道這個是noip提高的題目 說好k 4,其實k最大只有3 然後資料沒有對每一種情況近判斷性,所以本來300 的 因為有些用不到可以變成100 我曹 include include include define ll long long using namespace std int x 51...