NOIP2002矩形覆盖[几何DFS]
题目描述
在平面上有 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)
输出格式:
输出至屏幕。格式为:
一个整数,即满足条件的最小的矩形面积之和。
输入输出样例
4 2
1 1
2 2
3 6
0 7
4
-------------------------------------------------------------------------------
看上去好吓人----然而与计算几何基本无关
DFS每个点,枚举矩形来覆盖那个点,搜完点更新答案
别忘要一个矩形覆盖一点dfs后把矩形改回原来的状态
就是那些几何运算的函数写的有点多
并且naocan的犯了一个沙茶问题,竟然这样写判断:lx<=x<=rx
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=,INF=1e9;
struct point{
int x,y;
point(int a=,int b=):x(a),y(b){}
}p[N];
struct squ{
int lx,ly,rx,ry;
squ():lx(),rx(),ly(),ry(){}
}s[N];
int n,k,ans=INF;
inline bool isCover(int x,int y,int i){
if(s[i].lx<=x&&x<=s[i].rx && s[i].ly<=y&&y<=s[i].ry) return true;
return false;
}
bool checkSqu(int i,int j){
squ a=s[i],b=s[j];
//if(a.lx==INF || b.lx==INF) return false;
if(isCover(a.lx,a.ly,j)) return false;
if(isCover(a.lx,a.ry,j)) return false;
if(isCover(a.rx,a.ly,j)) return false;
if(isCover(a.rx,a.ry,j)) return false;
swap(a,b);swap(i,j);
if(isCover(a.lx,a.ly,j)) return false;
if(isCover(a.lx,a.ry,j)) return false;
if(isCover(a.rx,a.ly,j)) return false;
if(isCover(a.rx,a.ry,j)) return false;
return true;
}
bool check(){
for(int i=;i<=k;i++)
for(int j=;j<=k;j++){
if(i==j) continue;
if(s[i].lx==INF||s[j].lx==INF) continue;
if(!checkSqu(i,j)) return false;
}
return true;
}
int getS(){
int sum=;
for(int i=;i<=k;i++){
squ &now=s[i];
if(now.lx==INF) continue;
sum+=(now.rx-now.lx)*(now.ry-now.ly);
}
return sum;
}
void cover(point p,int i){
squ &a=s[i];
if(a.lx>p.x) a.lx=p.x;
if(a.ly>p.y) a.ly=p.y;
if(a.rx<p.x) a.rx=p.x;
if(a.ry<p.y) a.ry=p.y;
//printf("cover%d %d %d %d %d\n",i,s[i].lx,s[i].ly,s[i].rx,s[i].ry);
}
void dfs(int now){ //cout<<now<<" now\n";
if(now==n+){ //cout<<getS()<<" s\n";
ans=min(ans,getS());
return;
}
if(getS()>=ans) return;
for(int i=;i<=k;i++){
squ tmp=s[i];//printf("hi%d %d %d %d %d\n",i,s[i].lx,s[i].ly,s[i].rx,s[i].ry);
cover(p[now],i);
if(check()) dfs(now+);
s[i]=tmp; //printf("tmp%d %d %d %d %d\n",i,s[i].lx,s[i].ly,s[i].rx,s[i].ry);
}
//cout<<now<<" end\n";
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i].y,&p[i].x);//daozhe
}
for(int i=;i<=k;i++){
s[i].lx=s[i].ly=INF;
s[i].rx=s[i].ry=-INF;
}
dfs();
cout<<ans;
}
NOIP2002矩形覆盖[几何DFS]的更多相关文章
- [LuoguP1034][Noip2002] 矩形覆盖
[LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...
- NOIP2002 矩形覆盖
题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...
- COGS103&tyvj1899 [NOIP2002]矩形覆盖
题目里给的范围是k<=4,但是官方数据并没有k==4的情况,导致一些奇奇怪怪的DP写法也能过.听说标程在k==4的时候有反例,掀桌-.. 难怪COGS上k==4的数据答案是错的. 还是好好写个搜 ...
- 洛谷1034 NOIP2002 矩形覆盖
问题描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7). 这些点可以 ...
- 洛谷P1034 矩形覆盖
P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4( ...
- 洛谷 P1034 矩形覆盖
P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1(1,11,1),p_2p2( ...
- [luogu1034] 矩形覆盖 (暴力)
传送门 Description 给n(n<=50)个点(x,y),要求用k(1<=k<=4)个没有联系的矩形覆盖住求矩形最小面积 Solution 感觉不是很可做,结果看TJ后发现数 ...
- 【OpenJudge 1793】矩形覆盖
http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...
- bzoj 1185 旋转卡壳 最小矩形覆盖
题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...
随机推荐
- 什么是闭包(closure),为什么要用它?
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部. ...
- Android Studio 小提示,新建Activity
Android Studio是在google I/O大会上新发布的一个IDE,基于IntelliJ,Android开发除了Eclipse之外又多了一种选择. 在Android Studio中如何在当前 ...
- Linux下运行windows程序
现在Winxp停止了支持,那我们的windows程序是否可以再linux上执行呢,如下是一些参考的信息 在您的 Linux/Mac 操作系统上运行 Windows 软件 http://www.wine ...
- JAVA Web 实现会话跟踪的技术笔记
1.HTTP协议无状态:客户端的请求与服务器的响应所发生的一系列行为简单的说是客户发送了请求,服务器就给客户端响应,它们彼此之间都没有记录下来.如: 顾客与自动售货机 普通顾客(非会员)与商场 2.c ...
- 【即时通讯】XMPP调试与简单使用
上篇讲了[即时通讯]即时通讯及XMPP概述及环境配置,接下来我们就要进行调试,看看是否可用! 在测试之前我们需要先事先保存一些东西,以便后面使用 —— 登录openfire后台 ——获取服务器名和端口 ...
- 我的Android第四章:Android的adb命令使用以及SQlite数据库运用
adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用. adb有什么用?:借助adb工具,我们可以管理设备或手机模拟器的状态.还可以进行很多手机操作, ...
- AFNetworking菊花转圈圈
注意,此圈圈是在左上角,特别小,不注意是看不到的 加载这个东西,要先引入头文件: AFNetworkActivityIndicatorManager.h 然后只要一句代码就可以实现,默认情况下AFN的 ...
- CSS 行内样式 页内样式 外部样式
行内标签: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...
- iOS之 APNs全新的APNs苹果15年WWDC大会上的干货
记得14年在dl某大学校招上现场面试iOS时候被问到了APNs也就是苹果的推送问题,当时我表示一脸懵逼,因为当时还没有真正接触做过项目也就了解了个大概,总之当时回答的一塌糊涂!后来回去就在网上仔细查了 ...
- Windows 7 安装.net framework 4.0 失败,错误HRESULT 0xc8000222解决办法
今天在客服那里发现一个比较奇怪的错误,在客服机子上安装.NET Framework4.0时,出现如下错误:HRESULT 0xc8000222 百度了下原因,原来是win7自动更新造成的.原文网址:h ...