洛谷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 }

 

posted @ 2017-06-06 16:34  third2333  阅读(252)  评论(0编辑  收藏  举报