• 矩形覆盖(codevs 1101)


    题目描述 Description

    在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7)

    这些点可以用 k 个矩形(1<=k<4)全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。

    输入描述 Input Description

    n k
    xl y1

    x2 y2
    ... ...
    xn yn (0<=xi,yi<=500)

    输出描述 Output Description

    一个整数,即满足条件的最小的矩形面积之和。

    样例输入 Sample Input

    4 2
    1 1
    2 2
    3 6
    0 7

    样例输出 Sample Output

    4

    数据范围及提示 Data Size & Hint

    k<4

    官方是k<=4,但是标程解法在k=4时是有反例的。官方的数据也没有出现k=4的情况

    /*
      由于k<=3,所以可以分着做 
    */
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #define N 52
    #define INF 10000000
    using namespace std;
    int n,m;
    struct node
    {
        int x,y;
    };node a[N];
    bool cmp1(const node&s1,const node&s2)
    {
        return s1.x<s2.x;
    }
    bool cmp2(const node&s1,const node&s2)
    {
        return s1.y<s2.y;
    }
    int work1(int s,int t)
    {
        int mnx=INF,mxx=0,mny=INF,mxy=0;
        for(int i=s;i<=t;i++)
        {
              mnx=min(mnx,a[i].x);mxx=max(mxx,a[i].x);
              mny=min(mny,a[i].y);mxy=max(mxy,a[i].y);
        }
        return (mxx-mnx)*(mxy-mny);
    }
    int work2(int s,int t)
    {
        int minn=INF;
        sort(a+s,a+t+1,cmp1);//从左向右分 
        for(int i=s+1;i<=t-2;i++)
          if(a[i].x!=a[i+1].x)
            minn=min(minn,work1(s,i)+work1(i+1,t));
        sort(a+s,a+t+1,cmp2);//从上向下分
        for(int i=s+1;i<=t-2;i++) 
          if(a[i].y!=a[i+1].y)
            minn=min(minn,work1(s,i)+work1(i+1,t));
        return minn;
    }
    int work3(int s,int t)
    {
        int minn=INF;
        sort(a+s,a+t+1,cmp1);
        for(int i=s+1;i<=t-4;i++)
          if(a[i].x!=a[i+1].x)
            minn=min(minn,work1(s,i)+work2(i+1,t));
        for(int i=s+3;i<=t-2;i++)
          if(a[i].y!=a[i+1].y)
            minn=min(minn,work2(s,i)+work1(i+1,t));
        sort(a+s,a+t+1,cmp2);
        for(int i=s+1;i<=t-4;i++)
          if(a[i].x!=a[i+1].x)
            minn=min(minn,work1(s,i)+work2(i+1,t));
        for(int i=s+3;i<=t-2;i++)
          if(a[i].y!=a[i+1].y)
            minn=min(minn,work2(s,i)+work1(i+1,t));
        return minn;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
          scanf("%d%d",&a[i].x,&a[i].y);
        if(m==1)printf("%d",work1(1,n));
        if(m==2)printf("%d",work2(1,n));
        if(m==3)printf("%d",work3(1,n));
        return 0;
    }
    View Code
  • 相关阅读:
    git使用总结
    将本地项目上传到git
    ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常
    SQLQueryStress
    SQL Server 触发器
    HTTP 错误 404.3
    HTTP 错误 500.19 Internal Server Error的解决方法
    windows server 2012 配置多用户ftp服务器配置注意点
    自定义Remote验证(对博客园文章“Asp.net MVC验证哪些事(3)-- Remote验证及其改进(附源码)”自定义验证的改进)
    [ASP.net教程]IIS服务器 远程发布(Web Deploy)配置
  • 原文地址:https://www.cnblogs.com/harden/p/5931371.html
Copyright © 2020-2023  润新知