可能是資料太水了瞎搞都可以過。
判斷兩個平行於座標軸的矩形相交(含頂點與邊相交)的**一併附上。
記得這裡的xy和udlr是指數學上的座標軸。
#includeusingnamespace
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倍?
#includeusingnamespace
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...