题目描述 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=,mny=INF,mxy=;
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+,cmp1);//从左向右分
for(int i=s+;i<=t-;i++)
if(a[i].x!=a[i+].x)
minn=min(minn,work1(s,i)+work1(i+,t));
sort(a+s,a+t+,cmp2);//从上向下分
for(int i=s+;i<=t-;i++)
if(a[i].y!=a[i+].y)
minn=min(minn,work1(s,i)+work1(i+,t));
return minn;
}
int work3(int s,int t)
{
int minn=INF;
sort(a+s,a+t+,cmp1);
for(int i=s+;i<=t-;i++)
if(a[i].x!=a[i+].x)
minn=min(minn,work1(s,i)+work2(i+,t));
for(int i=s+;i<=t-;i++)
if(a[i].y!=a[i+].y)
minn=min(minn,work2(s,i)+work1(i+,t));
sort(a+s,a+t+,cmp2);
for(int i=s+;i<=t-;i++)
if(a[i].x!=a[i+].x)
minn=min(minn,work1(s,i)+work2(i+,t));
for(int i=s+;i<=t-;i++)
if(a[i].y!=a[i+].y)
minn=min(minn,work2(s,i)+work1(i+,t));
return minn;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
if(m==)printf("%d",work1(,n));
if(m==)printf("%d",work2(,n));
if(m==)printf("%d",work3(,n));
return ;
}

矩形覆盖(codevs 1101)的更多相关文章

  1. 【OpenJudge 1793】矩形覆盖

    http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...

  2. NOIP2002矩形覆盖[几何DFS]

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

  3. bzoj 1185 旋转卡壳 最小矩形覆盖

    题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...

  4. [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

    跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...

  5. NOIP2002 矩形覆盖

    题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...

  6. UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]

    题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...

  7. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1945  Solve ...

  8. BZOJ:1185: [HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...

  9. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1435  Solve ...

  10. 矩形覆盖(JAVA)

    矩形覆盖 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路:最初看到这题,只能通过画图归纳来寻找规律. ...

随机推荐

  1. 2-SAT开坑

    Reference:http://blog.csdn.net/jarjingx/article/details/8521690 其中伍昱的ppt不错. 2SAT最裸的模型: 一国有n个党派,每个党派在 ...

  2. 关于IntentFilter的几点注意事项:

    http://blog.csdn.net/cnnumen/article/details/8464786 IntentFilter就是用于描述intent的各种属性, 比如action, catego ...

  3. 初学structs2,结果类型简单示例

    一.自定义结果处理类,structs.xml中package节点下加result-types节点,在result-types节点下配置result-type的属性.然后在配置的action中的resu ...

  4. Advice for applying Machine Learning

    https://jmetzen.github.io/2015-01-29/ml_advice.html Advice for applying Machine Learning This post i ...

  5. python集合类型set

    set 类型的简单粗暴取出并集合交集  |   & li=[11,22,33] n_li=[44,55] b= (list(set(li)&set(n_li))) b2=set(li) ...

  6. 使用stty修改终端设置 stty 用法!

    在linux/unix平台上的 sqlplus中,如果输错了字符,要想删除,习惯性的按下backspace键后,发现非但没有删除想要删掉的字符,还多出了两个字符^H.当然,我们 可以同时按下ctrl+ ...

  7. 把电脑装成ubuntu系统了

    2014年一月11日 今天本来想在自己的电脑上装双系统,电脑本来有个win7,想再装一个ubuntu. 本来想用wubi装,可是wubi没法安装13.10,并且wubi安装后,读写速度也不快. 在网上 ...

  8. Java之内存分析和String对象

    原文地址:http://www.cnblogs.com/devinzhang/archive/2012/01/25/2329463.html 文中 s2后面的注释是错误的,应该是”创建一个对象(堆中) ...

  9. php面试题之二——Javascript(基础部分)

    二.JavaScript部分 1. JS 表单弹出对话框函数是?获得输入焦点函数是? 弹出对话框函数:alert(), prompt(), confirm() 获得输入焦点函数:focus() 2. ...

  10. HDU 1029 Ignatius and the Princess IV

    解题报告: 题目大意:就是要求输入的N个数里面出现的次数最多的数是哪一个,水题.暴力可过,定义一个一位数组,先用memset函数初始化,然后每次输入一个数就将下标对应的上标对应的那个数加一,最后将整个 ...