洛谷 P1034 矩形覆盖

P1034 矩形覆盖

题目描述

在平面上有 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。各个矩形必须完全分开(边线与顶点也都不能重合)。

输入输出格式

输入格式:

n k xl y1 x2 y2 ... ...

xn yn (0<=xi,yi<=500)

输出格式:

输出至屏幕。格式为:

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

输入输出样例

输入样例#1:

4 2
1 1
2 2
3 6
0 7

输出样例#1:

4思路:深搜,枚举每个点放在哪个矩形中吐槽:(╯‵□′)╯︵┻━┻,cogs上第6组数据竟然是错误的,害我调试了辣么久。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,ans=0x7f7f7f7f,val;
struct nond{
    int x,y;
}v[60];
struct none{
    int l,r,u,d; //记录这个矩形的四极。
    bool falg;    //判断这个矩形内有没有点
}f[5];
int judge(int i,int j){
    if(f[i].l<=f[j].l&&f[i].r>=f[j].l&&f[i].d>=f[j].d&&f[i].u<=f[j].d)    return 1;
    if(f[i].l<=f[j].r&&f[i].r>=f[j].r&&f[i].d>=f[j].d&&f[i].u<=f[j].d)    return 1;
    if(f[i].l<=f[j].l&&f[i].r>=f[j].l&&f[i].d>=f[j].u&&f[i].u<=f[j].u)    return 1;
    if(f[i].l<=f[j].r&&f[i].r>=f[j].r&&f[i].d>=f[j].u&&f[i].u<=f[j].u)    return 1;
    return 0;
}
void dfs(int num){
    val=0;
    for(int i=1;i<=k;i++){
        if(f[i].falg)
            for(int j=i+1;j<=k;j++)
                if(f[j].falg&&judge(i,j))    return ;
        val+=(f[i].r-f[i].l)*(f[i].d-f[i].u);//统计到目前为止的矩形的面积和。
    }
    if(val>=ans)    return;
    if(num>n){
        ans=val;
        return ;
    }
    for(int i=1;i<=k;i++){
        none tmp=f[i];
        if(!f[i].falg){
            f[i].falg=1;
            f[i].l=f[i].r=v[num].x;
            f[i].d=f[i].u=v[num].y;
            dfs(num+1);
            f[i]=tmp;
        }
        else{
            f[i].l=min(f[i].l,v[num].x);
            f[i].r=max(f[i].r,v[num].x);
            f[i].u=min(f[i].u,v[num].y);
            f[i].d=max(f[i].d,v[num].y);
            dfs(num+1);
            f[i]=tmp;
        }
    }
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&v[i].x,&v[i].y);
    dfs(1);
    cout<<ans;
}
 
时间: 2024-10-14 05:48:26

洛谷 P1034 矩形覆盖的相关文章

洛谷——P1034 矩形覆盖

https://www.luogu.org/problem/show?pid=1034 题目描述 在平面上有 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 给出后,怎样才能使得覆盖所

[NOIP2002] 提高组 洛谷P1034 矩形覆盖

题目描述 在平面上有 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:覆盖平行于坐标轴

P1034 矩形覆盖

题目描述 在平面上有 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:覆盖平行于坐标轴

洛谷——P2082 区间覆盖(加强版)

P2082 区间覆盖(加强版) 题目描述 已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长. 输入输出格式 输入格式: N s1 t1 s2 t2 …… sn tn 输出格式: 共一行,一个正整数,为覆盖后的区间总长. 输入输出样例 输入样例#1: 复制 3 1 100000 200001 1000000 100000000 100000001 输出样例#1: 复制 900002 说明 [数据范围] 对于40%的数据 N≤1000,0<Si<Ti≤10000 对于100%

洛谷 P2764 LibreOJ 6002 最小路径覆盖问题

题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. «编程任务:

1185: [HNOI2007]最小矩形覆盖

1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1426  Solved: 648[Submit][Status][Discuss] Description Input Output Sample Input Sample Output HINT Source 计算几何 vfleaking提供Spj #include<cstdio> #include<cmat

洛谷1003 铺地毯 解题报告

洛谷1003 铺地毯 本题地址:http://www.luogu.org/problem/show?pid=1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上. 地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号.注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖. 输

洛谷P1519 穿越栅栏 Overfencing

P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 USACO是100分,洛谷是20分 为什么只有十分 题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路.给定迷宫的宽度W(1<=W<=38)及高度H(1<=H&

洛谷P1257 平面上的最接近点对 数学 分治 排序

来自洛谷上的题解 方法一: 先求第1个点与其余n-1个点的距离: 再求第2个点与其余n-2个点的距离: 再求第3个点与其余n-3个点的距离: ---------------- 再求第n-1个点与其余1个点的距离: 然后找出最小值. 如此的算法复杂度为O(n^2),显然不能满足本题的需要.但--貌似洛谷神机可以--过-- 欢迎朴素的同学挑战数据加强版新 方法二: 考虑以下分治算法: 设平面上的点都在点集S中,为了将S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l(方程:x=m)来作