洛谷P1034 矩形覆盖 暴搜
洛谷P1034 矩形覆盖
暴搜
因为 k<=4 所以爆搜一下就行
1、对于每个点 爆搜他属于哪一个矩形
2、并且 用这个点 来更新矩形的 左边界 右边界 上边界 下边界
3、回溯
优化 1、一边加入点一边判断是否符合要求
2、已有的矩形中是否有相互覆盖的情况
3、以及现在的矩形面积是否大于已有的 最小答案的矩形 如果是 说明不可能更优,那么就直接退出
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std ; 10 11 inline int read() 12 { 13 char ch = getchar() ; 14 int x = 0,f = 1 ; 15 while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 16 while(ch>='0'&&ch<='9') { x = x*10 + ch - 48 ; ch = getchar() ; } 17 return x*f ; 18 } 19 20 21 const int maxn = 51,inf = 1e9 ; 22 struct dot { 23 int x,y ; 24 }d[51]; 25 struct node{ 26 dot l,r ; 27 }rec[5] ; 28 int n,k,ans ; 29 30 inline int getS() 31 { 32 int sum = 0 ; 33 for(int i=1;i<=k;i++) 34 { 35 if(rec[ i ].l.x==inf ) continue ; 36 sum = sum + ( rec[ i ].r.x - rec[ i ].l.x ) * ( rec[ i ].r.y - rec[ i ].l.y ) ; 37 } 38 return sum ; } 39 40 41 inline bool conf(int i,int j) 42 { 43 if( rec[ i ].l.x==inf ) 44 return 0 ; 45 if( rec[ j ].l.x==inf ) 46 return 0 ; 47 if( rec[ i ].r.x<rec[ j ].l.x || rec[ i ].r.y<rec[ j ].l.y ) return 0 ; 48 if( rec[ j ].r.x<rec[ i ].l.x || rec[ j ].r.y<rec[ i ].l.y ) return 0 ; 49 return 1 ; 50 51 } 52 53 inline bool can() 54 { 55 for(int i=1;i<=k-1;i++) 56 for(int j=i+1;j<=k;j++) 57 if( conf(i,j) ) return 0 ; 58 return 1 ; 59 } 60 61 inline void dfs(int used) 62 { 63 if(used==n) 64 { 65 int S = getS() ; 66 if(S < ans) ans = S ; 67 return ; 68 } 69 for(int i=1;i<=k;i++) 70 { 71 node temp = rec[ i ] ; 72 if ( d[used+1].x<rec[ i ].l.x ) rec[ i ].l.x = d[used+1].x ; 73 if ( d[used+1].x>rec[ i ].r.x ) rec[ i ].r.x = d[used+1].x ; 74 if ( d[used+1].y<rec[ i ].l.y ) rec[ i ].l.y = d[used+1].y ; 75 if ( d[used+1].y>rec[ i ].r.y ) rec[ i ].r.y = d[used+1].y ; 76 if ( can()&&getS()<ans ) dfs(used+1) ; 77 rec[ i ] = temp ; //回溯 78 } 79 } 80 81 int main() 82 { 83 n = read() ; 84 k = read() ; 85 ans = inf ; 86 for(int i=1;i<=n;i++) 87 d[ i ].x = read(),d[ i ].y = read() ; 88 for(int i=1;i<=k;i++) 89 { 90 rec[ i ].l.x = rec[ i ].l.y = inf ; 91 rec[ i ].r.x = rec[ i ].r.y = -inf ; 92 } 93 94 dfs( 0 ) ; 95 printf("%d\n",ans) ; 96 97 98 return 0 ; 99 }