據說是dp,所以我用dfs,居然a了,資料真水
說說思路,我們要求覆蓋所有點且不能重疊,顯然我們要從點入手,我們可以列舉每個點被哪個矩形重疊,因為如果列舉矩形覆蓋點的話,貌似不可做,具體怎麼實現呢?最好小夥伴們手動畫個圖,一下就明白了,列舉每個點被哪個矩形覆蓋,那麼必然是要根據點的座標來調整矩形的位置,所以我們需要判斷當前列舉的點的座標與當前矩形的關係,顯然有兩種關係,在矩形內部,在矩形外部,在內部顯然矩形不需要變化,在矩形外部呢?我們需要分類討論
1.在矩形兩側,高度範圍在矩形的高度範圍內,那麼調整矩形橫座標
2.在矩形上下,橫座標在矩形的橫座標範圍內,那麼調整矩形縱座標
3.完全脫離矩形範圍,這時就要根據點的座標進行大調整
然後是如何判斷重合,自己將兩個矩形重疊時的樣子畫出來,標上座標,一共四種情況,直接if判斷就好,資料水 ,不需要剪枝,也是0ms過,233
**
//by acermo
#include#include#include#include#includeusing namespace std;
const int m=1050;
struct emm
poi[m];
struct square
}fg[5];
int vis[m][m];
int n,m,ans=m*m;
int gets(int i)
int add(int po,int sq)//分類討論點和矩形的關係
int s=gets(sq);
if (poi[po].xfg[sq].y2) fg[sq].y2=poi[po].y;
return (gets(sq)-s);
}//點在矩形左側,更改矩形面積 ,返回差值
if (poi[po].x>=fg[sq].x1&&fg[sq].x2>=poi[po].x)
if (poi[po].yfg[sq].y2) fg[sq].y2=poi[po].y;
return (gets(sq)-s);
} return 0;
}bool check()//判斷是否存在違法狀態
void dfs(int used,int sum)
for (int i=1;i<=m;i++)
return ;
}int main()
搜尋 洛谷P1034 矩形覆蓋
然後就知道這個是noip提高的題目 說好k 4,其實k最大只有3 然後資料沒有對每一種情況近判斷性,所以本來300 的 因為有些用不到可以變成100 我曹 include include include define ll long long using namespace std int x 51...
洛谷 P1034 矩形覆蓋(dfs)
有n個點k個矩陣,k個矩陣包含n個點,求這k個矩陣的最小面積 因為資料範圍很小,所以可以直接暴搜,求每個點可以存在矩陣的位置,利用幾次剪枝 因為資料太水,不剪也行 即可通過 include using namespace std define ll long long const int maxn ...
洛谷 P1034 矩形覆蓋 dfs
可能是資料太水了瞎搞都可以過。判斷兩個平行於座標軸的矩形相交 含頂點與邊相交 的 一併附上。記得這裡的xy和udlr是指數學上的座標軸。includeusing namespace std define ll long long struct point p 51 struct rectangle ...