BZOJ 1052 覆盖问题
Description
某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小树遮起来。我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个L*L的正方形的边要求平行与坐标轴,一个点如果在正方形的边界上,也算作被覆盖。当然,我们希望塑料薄膜面积越小越好,即求L最小值。
Input
第一行有一个正整数N,表示有多少棵树。接下来有N行,第i+1行有2个整数Xi,Yi,表示第i棵树的坐标,保证不会有2个树的坐标相同。
Output
一行,输出最小的L值。
Sample Input
0 1
0 -1
1 0
-1 0
Sample Output
HINT
首先可以确定此题满足可二分性,明显可以二分答案。所以我们只要能够在线性时间内检验即可了。
线性检测我们可以贪心解决,我们将每次还未被覆盖的点用一个最小的矩形来覆盖,然后每次选择用正方形覆盖它的四个角,总共递归三层,64种情况。所以我们枚举这64种情况,看是否能有一种能够覆盖所有的点。
这个贪心我开始没想到,现在也不会证明(理性想想是对的),我开始想的取左下角的点(x优先)为正方形左下角wa了,然后左下角的点(y优先)为正方形左下角wa了,再最左最下的两条平行坐标轴线的交点为正方形左下角还是wa了。最后将三者综合起来,还是wa了,但是正确率高了一些。这启发我以后贪心可以综合起来,取最优解正确率会高很多。
#include<vector>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; #define inf (1<<29)
#define maxn 20010
int n,x[maxn],y[maxn]; bool exist[maxn]; inline bool dfs(int L,int step,int all)
{
if (all == n) return true;
if (step > ) return false;
int up = -inf,down = inf,le = inf,ri = -inf;
for (int i = ;i <= n;++i)
if (!exist[i])
{
up = max(y[i],up),down = min(y[i],down);
ri = max(x[i],ri),le = min(x[i],le);
}
int inc,nl,nr,nu,nd; vector <int> vec;
inc = ; nl = le,nr = le+L,nu = up,nd = up-L;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
inc = ; nl = le,nr = le+L,nu = down+L,nd = down;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
inc = ; nl = ri-L,nr = ri,nu = up,nd = up-L;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
inc = ; nl = ri-L,nr = ri,nu = down+L,nd = down;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
return false;
} inline bool okay(int L)
{
memset(exist,false,n+);
return dfs(L,,);
} int main()
{
freopen("1052.in","r",stdin);
freopen("1052.out","w",stdout);
scanf("%d",&n); for (int i = ;i <= n;++i) scanf("%d %d",&x[i],&y[i]);
if (okay()) printf(""),exit();
int l = ,r = inf,mid;
while (l <= r)
{
mid = (l + r) >> ;
if (okay(mid)) r = mid - ;
else l = mid + ;
}
printf("%d",l);
fclose(stdin); fclose(stdout);
return ;
}
BZOJ 1052 覆盖问题的更多相关文章
- [BZOJ]1052 覆盖问题(HAOI2007)
		三矩形覆盖问题啊……不过听说FJOI还出过双圆覆盖问题? Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来, ... 
- BZOJ 1052: [HAOI2007]覆盖问题
		BZOJ 1052: [HAOI2007]覆盖问题 题意:给定平面上横纵坐标在-1e9~1e9内的20000个整数点的坐标,用三个大小相同边平行于坐标轴的正方形覆盖(在边界上的也算),问正方形的边长最 ... 
- 二分判定 覆盖问题 BZOJ 1052
		//二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ... 
- 【BZOJ 1052】 1052: [HAOI2007]覆盖问题 (乱搞)
		1052: [HAOI2007]覆盖问题 Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的 ... 
- AC日记——[HAOI2007]覆盖问题 bzoj 1052
		1052 思路: 二分答案: 二分可能的长度: 然后递归判断长度是否可行: 先求出刚好覆盖所有点的矩形: 可行的第一个正方形在矩形的一个角上: 枚举四个角上的正方形,然后删去点: 删去一个正方形后,递 ... 
- [BZOJ 1052][HAOI2007]覆盖问题(二分答案)
		题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1052 分析: 挺有想法的一道题,先二分答案ans,主要是判断的问题. 首先可以弄出把所 ... 
- BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS
		标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ... 
- 【以前的空间】bzoj 1052 [HAOI2007]覆盖问题
		这道题的思路挺简单的……就是可以证明如果要覆盖一个区域内的点,那么一定有一个正方形在这“区域内的点所围成的最大矩形的四个角中的一个”(不要吐槽很多的“的”……),对于长度r是否可以覆盖整个区域内的点, ... 
- bzoj 1052 dfs
		首先可以二分答案,将最优性问题转化为判定性问题. 对于二分到的边长,我们可以把所有的点看成一个大的矩形,这个矩形为包括所有点的最小矩形,那么贪心的想,3个正方形,第一个肯定放在这个矩形其中的一角,然后 ... 
随机推荐
- python 多级菜单 纯循环与分支
			源代码: dic1 = {'湖南':{'衡阳':{'珠晖区':'湖南工学院'},'湘潭':{'晖晖':'啦啦'}}, '北京':{'朝阳': {"德玛:北京大学"}}}print( ... 
- 接口作为参数,不同的接口调用不同的方法,例如:输出“I love Game”或输出“我喜欢游戏”
			接口的思想:在于可以增加很多类都需要实现的功能.比如:各式各样的商品,可能隶属不同公司,但工商部门都必须具有显示商标的功能(实现同一接口).商标的具体制作由各个公司自己去实现. 给其他类去实现,不同的 ... 
- 浅谈UML中类之间的五种关系及其在代码中的表现形式
			本文转载:http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html 什么是类? 将某类东西归纳在一起,可以成为一个类. 类有很多种 ... 
- Shell脚本编程——了解你的Linux系统必须掌握的20个命令
			要想详细了解你的Linux系统,为系统评估和性能调化提供准确的信息,那么,你会经常用到这几组命令. 一. 系统信息 1. 查看内核版本.编译主机.编译器版本和编译时间的信息 cat /p ... 
- Android 颜色渲染(九) PorterDuff及Xfermode详解
			版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色渲染(九) PorterDuff及Xfermode详解 之前已经讲过了除ComposeShader之外Shader的全部子类 ... 
- AlgorithmVisualizer
			http://jasonpark.me/AlgorithmVisualizer/#path=graph_search/floyd_warshall/shortest_paths 
- Qt 学习之路:线程和 QObject
			前面两个章节我们从事件循环和线程类库两个角度阐述有关线程的问题.本章我们将深入线程间得交互,探讨线程和QObject之间的关系.在某种程度上,这才是多线程编程真正需要注意的问题. 现在我们已经讨论过事 ... 
- Apple-Watch开发2 APPIcon设置
			网址:http://makeappicon.com/ 直接放置到相应的文件即可 (these are all in pixels) 48 x 48 55 x 55 58 x 58 80 x 80 87 ... 
- hadoop集群环境搭建之安装配置hadoop集群
			在安装hadoop集群之前,需要先进行zookeeper的安装,请参照hadoop集群环境搭建之zookeeper集群的安装部署 1 将hadoop安装包解压到 /itcast/ (如果没有这个目录 ... 
- try{}catch(){}//根据异常信息使用不同的方法要怎么实现
			try{ }catch(Exception e){ if(e.getMessage().contains("123456798")) //使用e.getMessage().cont ... 
