矩形覆盖(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=,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)的更多相关文章
- 【OpenJudge 1793】矩形覆盖
http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...
- NOIP2002矩形覆盖[几何DFS]
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- bzoj 1185 旋转卡壳 最小矩形覆盖
题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...
- [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖
跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...
- NOIP2002 矩形覆盖
题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...
- UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...
- 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1945 Solve ...
- BZOJ:1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1435 Solve ...
- 矩形覆盖(JAVA)
矩形覆盖 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路:最初看到这题,只能通过画图归纳来寻找规律. ...
随机推荐
- 查看apk包名package和入口activity名称的方法
ctrl+r 打开CMD窗口 进入sdk-aapt目录 执行命令:aapt dump badging xx.apk 内容太多?不好看,没关系,全部拷出来,ctrl+f,so easy! package ...
- Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457 Android启动模式Flags栈Task 目录(?)[+] 什么是栈 栈 ...
- python scrapy 获取华为应用市场APP评论数据
scrapy入门 四步: 1. 创建一个新的Scrapy Project 2. 定义你需要从网页中提取的元素Item 3. 实现一个Spider类,通过接口完成爬取URL和提取Item的功能 4. 实 ...
- MyEclipse------缓冲流的使用
可以把BufferedReader和BufferedWriter称为上层流,把它们指向的字符流(Reader,Writer)称为底层流. Java采用缓存技术将上层流和底层流连接. 底层字符输入流先将 ...
- std::stringstream
使用 std::stringstream,小心 内存! 适时 清空 缓冲 …… 2007年12月14日 星期五 : stringstream是个好东西,网上有不少文章,讨论如何用它实现各种数据类型的转 ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- ORA-00931: missing identifier ORA-06512: at "SYS.DBMS_UTILITY"
Database db = DatabaseFactory.CreateDatabase(); string sql = "SELECT * FROM table&qu ...
- C语言中strstr函数
头文件:#include <string.h> strstr()函数用来检索子串在字符串中首次出现的位置,其原型为: char *strstr( char *str, char * ...
- MyISAM 与 InnoDB 的区别
MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...
- 解决Yum安装依赖问题
导读 最近在网上看到很多关于安装网络Yum源是报错的求助,本小白也曾遇到过此类问题,后找过度娘没有有效的解决办法.最后,经过几番尝试后终于解决,现在将解决方案共享给大家! Yum源及安装 安装过程在之 ...