zoukankan      html  css  js  c++  java
  • 洛谷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
    ",ans) ; 
    96     
    97     
    98     return 0 ; 
    99 }
  • 相关阅读:
    Json To CSharp
    一种C#泛型方法在lua中表示的设计
    FSM Code Generator
    vmware无法安装vmware authorization&windows无法启动VMware Authorization Service服务
    攻击树威胁建模
    自适应安全架构的历史和演进
    网络攻击如何影响物理世界
    网络安全红蓝军对抗完整战术周期
    工作组渗透-内网搜集实战
    AV-TEST杀毒软件能力测试(2018年1月-12月)杀毒软件排名
  • 原文地址:https://www.cnblogs.com/third2333/p/6952296.html
Copyright © 2011-2022 走看看