题解 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时,可用如图二的两个矩形S1,s2覆盖,81,S2面积和为4。问题是当n个点坐标和k给出后,怎样才能使得覆盖所有点的k个矩形的面积之和为最小呢?
约定:覆盖一个点的矩形面积为0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。
题意
有n个点,找k个矩形包含所有点,使k个矩形和面积和最小。
题解
这道题刚拿到手里的时候是挺棘手的,但是我们看数据范围的大小,是可以暴力枚举的,所以我们可以尝试一下暴力枚举。
建图操作
maps用来存图
ss用来存构建的矩形
立flag来统计这种矩形是否建过
数据最大是4块矩形,可以开小数组
struct maps
{
int x,y;
} mapp[51];
struct ss
{
int l,r,u,d;
bool flag;
} p[5];
判断操作
judge函数枚举四种不成立的情况
in函数判断范围,便于书写judge函数
bool in(ss a, int x, int y)
{
if (x>=a.l&&x<=a.r&&y>=a.d&&y<=a.u) return 1;
return 0;
}
bool judge(ss a, ss b)
{
if (in(a,b.l,b.u)) return 1;
if (in(a,b.l,b.d)) return 1;
if (in(a,b.r,b.u)) return 1;
if (in(a,b.r,b.d)) return 1;
return 0;
}
dfs操作
构建好m个矩形
计算面积和
每次存最小值
搜完结束
void dfs(int num)
{
int value=0;
for (int i=1; i<=m; i++)
{
if (p[i].flag)
{
for (int j=i+1; j<=m; j++)
if (judge(p[i],p[j])) return;
}
value+=(p[i].r-p[i].l)*(p[i].u-p[i].d);
}
if (value>=ans) return;
if (num>n){
ans=value;
return;
}
for (int i=1; i<=m; i++)
{
ss tmp=p[i];
if (p[i].flag==0)
{
p[i].flag=1;
p[i].l=p[i].r=mapp[num].x;
p[i].u=p[i].d=mapp[num].y;
dfs(num+1); p[i]=tmp;
break;
}
else
{
p[i].r=max(p[i].r,mapp[num].x);
p[i].l=min(p[i].l,mapp[num].x);
p[i].u=max(p[i].u,mapp[num].y);
p[i].d=min(p[i].d,mapp[num].y);
dfs(num+1);
p[i]=tmp;
}
}
}
代码
#include<cstdio>
#include<iostream>
using namespace std;
struct maps
{
int x,y;
} mapp[51];
struct ss
{
int l,r,u,d;
bool flag;
} p[5];
int n,m,ans=0x7f7f7f7f;
bool in(ss a, int x, int y)
{
if (x>=a.l&&x<=a.r&&y>=a.d&&y<=a.u) return 1;
return 0;
}
bool judge(ss a, ss b)
{
if (in(a,b.l,b.u)) return 1;
if (in(a,b.l,b.d)) return 1;
if (in(a,b.r,b.u)) return 1;
if (in(a,b.r,b.d)) return 1;
return 0;
}
void dfs(int num)
{
int value=0;
for (int i=1; i<=m; i++)
{
if (p[i].flag)
{
for (int j=i+1; j<=m; j++)
if (judge(p[i],p[j])) return;
}
value+=(p[i].r-p[i].l)*(p[i].u-p[i].d);
}
if (value>=ans) return;
if (num>n){
ans=value;
return;
}
for (int i=1; i<=m; i++)
{
ss tmp=p[i];
if (p[i].flag==0)
{
p[i].flag=1;
p[i].l=p[i].r=mapp[num].x;
p[i].u=p[i].d=mapp[num].y;
dfs(num+1); p[i]=tmp;
break;
}
else
{
p[i].r=max(p[i].r,mapp[num].x);
p[i].l=min(p[i].l,mapp[num].x);
p[i].u=max(p[i].u,mapp[num].y);
p[i].d=min(p[i].d,mapp[num].y);
dfs(num+1);
p[i]=tmp;
}
}
}
int main(void)
{
scanf("%d%d",&n,&m);
for (int i=1; i<=n; i++) scanf("%d%d",&mapp[i].x,&mapp[i].y);
dfs(1);
printf("%d",ans);
return 0;
}
题解 P1034 【矩形覆盖】的更多相关文章
- 洛谷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( ...
- 洛谷 - P1034 - 矩形覆盖 - dfs
https://www.luogu.org/problemnew/show/P1034 可能是数据太水了瞎搞都可以过. 判断两个平行于坐标轴的矩形相交(含顶点与边相交)的代码一并附上. 记得这里的xy ...
- [NOIP2002] 提高组 洛谷P1034 矩形覆盖
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- 洛谷——P1034 矩形覆盖
https://www.luogu.org/problem/show?pid=1034 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的 ...
- P1034 矩形覆盖
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- luoguP1034 矩形覆盖 x
P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4( ...
- C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...
- 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1945 Solve ...
- TZOJ 2392 Bounding box(正n边形三点求最小矩形覆盖面积)
描述 The Archeologists of the Current Millenium (ACM) now and then discover ancient artifacts located ...
随机推荐
- offsetHeight,scrollHeight,clientHeight,scrollTop以及pageX,clientX,offsetX,screenX,offsetLeft,style.left等的区别以及使用详解
一.写在前面 在阅读本文前,希望大家能针对每个属性亲手测试,网上现有的大量相关博客都有不等的概念错误,毕竟亲手实践才能更好的掌握这些概念. 1.pageX,clientX,screenX与offset ...
- 【转】CSS选择器笔记
作者: 阮一峰 日期: 2009年3月12日 来源:http://www.ruanyifeng.com/blog/2009/03/css_selectors.html 去年我学jQuery的时候,曾经 ...
- .1-浅析webpack源码之webpack.cmd
此系列随时可能断更,毕竟我是解释型源码分析…… tips:本系列源码版本为3.10.0 尝试看过Spring的源码,有点烧脑,所以还是重回JS吧! 在配置完环境变量后,可以通过webpack指令进行打 ...
- ABP 数据库 -- ABP&EF中的多表、关联查询
本文介绍一下ABP中的多表查询. 1.创建实体 多表查询,在ABP或者EF中都很简单,这里我们创建一个Demo,一个学生实体.一个学校实体. 学校里面可以有很多学生,学生有一个学校. 实体如下: 学校 ...
- Winform下判断文件和文件夹是否存在
//选择文件夹 FolderBrowserDialog dia = new FolderBrowserDialog(); if (dia.ShowDialog() == System.Windows. ...
- [Angularjs]cookie操作
摘要 现在很多app采用内嵌h5的方式进行开发,有些数据会存在webveiw的cookie中,那么如果使用angularjs开发单页应用,就需要用到angularjs的cookie操作.这里提供一个简 ...
- MySql错误处理-错误处理的例子
有几种错误处理的声明形式: § 如果任何错误(不是 NOT FOUND ) , 设置 l_error 为 1 后继续执行: DECLARE CONTINUE HANDLER FOR SQLEXCEPT ...
- [android] ndk环境的搭建
C语言的编辑加运行,分两步 编译阶段 连接阶段 java语言的步骤是 转成.class文件 java的虚拟机运行 C语言在windows上==> .o中间文件 ==>.exe可执行文件 ...
- java项目运用server运行(eclipse、myeclipse通用)
右键点击”new“选择“Other”,打开选项 勾选”Show All Wizards“ 然后在搜索处输入server,选择server,点击next 刚进来时此处都是空的,点击Configure r ...
- Java - Map总结
Java提高篇(三三)-----Map总结 一.Map概述 首先先看Map的结构示意图 Map:“键值”对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. SortedMap:有序的键值对接口 ...