题目描述 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. Java JDBC下执行SQL的不同方式、参数化预编译防御

    相关学习资料 http://zh.wikipedia.org/wiki/Java数据库连接 http://lavasoft.blog.51cto.com/62575/20588 http://blog ...

  2. javaIO(二)

    在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...

  3. 能产生粒子效果的CAEmitterLayer

    能产生粒子效果的CAEmitterLayer 下雪效果: // // RootViewController.m // Cell // // Copyright (c) 2014年 Y.X. All r ...

  4. [Angularjs]ng-class,ng-class-even,ng-class-odd

    写在前面 最近在通过angularjs将数据绑定到前端,其中也涉及到很多新的东西,一些效果还是很有必要实现的.在使用中发现ng-class,ng-class-even.ng-class-odd的使用, ...

  5. 裴波那契数列 JavaScript 尾递归实现

    一般递归实现 : //经典递归 function fibonacci(n) { return (function(n) { ) ; ); })(n); } 或者: function fibonacci ...

  6. PHP iconv函数字符串转码导致截断问题

    1.iconv函数原型 string iconv ( string $in_charset , string $out_charset , string $str ) in_charset:输入的字符 ...

  7. exe4j中"this executable was created with an evaluation错误解决方法

    在使用exe4j时,如果您的exe4j没有注册,在运行有exe4j转换的*.jar为*.exe的可执行文件是会提示:"this executable was created with an ...

  8. linux下可以禁用的一些服务

    linux下多软件/多脚本之间的配合: 包括做好 “实体”和“配置”两个方面的事情 “实体”是指实实在在的脚本文件,服务脚本: “配置”是指其他与之交互的.协同工作的软件.脚本,要进行适当的配置,告知 ...

  9. mysql 多表联合更新

    UPDATE mall_order moLEFT JOIN mall_order_goods mog ON mo.id = mog.order_idSET mo.ratio=0.08WHERE mog ...

  10. app内嵌web的一些问题记录

    问题(1)webview里面出现大图预览,点击手机上的返回,应该是图片预览消失 问题(2)键盘输入的时候,键盘会把输入框遮挡 ------------------------------------- ...