【bzoj1052】【HAOI2007】【覆盖问题】【贪心】

原创 2015年11月21日 17:10:19

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

4
0 1
0 -1
1 0
-1 0

Sample Output

1

HINT

100%的数据,N<=20000

题解:首先二分L。

           对于判断,首先用一个最小的矩阵去覆盖树苗。显然塑料薄膜应该放到矩阵的角上。

           然后我们先暴力放两个薄膜,然后判断剩下的点能否放到一个薄膜里。

代码:

#include<iostream>
#include<cstdio>
#define N 20010
#define INF 1000000000
using namespace std;
int n,l,r,mid,ans;
struct use{int x[N],y[N],mx;}p,q;
void del(use &t,int x,int y,int xx,int yy){
 int n=t.mx;t.mx=0;
 for (int i=1;i<=n;i++)if (t.x[i]<x||t.x[i]>xx||t.y[i]<y||t.y[i]>yy){t.x[++t.mx]=t.x[i];t.y[t.mx]=t.y[i];}
}
void cal(use &t,int kind,int l){
  int x(INF),xx(-INF),y(INF),yy(-INF);
  for (int i=1;i<=t.mx;i++){
    x=min(x,t.x[i]);y=min(y,t.y[i]);xx=max(xx,t.x[i]);yy=max(yy,t.y[i]);
    }
  if (kind==1)del(t,x,y,x+l,y+l);if (kind==2)del(t,xx-l,y,xx,y+l);
  if (kind==3)del(t,x,yy-l,x+l,yy);if (kind==4)del(t,xx-l,yy-l,xx,yy);
}
bool check(int v){  
  for (int i=1;i<=4;i++)
   for (int j=1;j<=4;j++){
    int x(INF),xx(-INF),y(INF),yy(-INF);
      for (int k=1;k<=n;k++) q.x[k]=p.x[k],q.y[k]=p.y[k];
       q.mx=n;cal(q,i,v);cal(q,j,v);
      for (int k=1;k<=q.mx;k++){x=min(x,q.x[k]);y=min(y,q.y[k]);xx=max(xx,q.x[k]);yy=max(yy,q.y[k]);}
      if (xx-x<=v&&yy-y<=v) return true;
   }
  return false;
}
int main(){
  scanf("%d",&n);p.mx=n;l=1;r=INF;
  for (int i=1;i<=n;i++)  scanf("%d%d",&p.x[i],&p.y[i]);     
  while (l<=r){mid=(l+r)>>1;if (check(mid)){ans=mid;r=mid-1;}else l=mid+1;}
  printf("%d\n",ans);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ1052: [HAOI2007]覆盖问题

Description   某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料...
  • wxh010910
  • wxh010910
  • 2016年11月11日 20:18
  • 174

【bzoj1052】【HAOI2007】【覆盖问题】【贪心】

Description 某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄...
  • sunshinezff
  • sunshinezff
  • 2015年11月21日 17:10
  • 313

冬天来了

这个时间写这个标题似乎有点过分了。不过的确是这三天来的低温,让我感受到了冬的气息。坐在这里敲电脑还是有点冷,脚是冰凉的,依然有几丝风透过玻璃和窗帘钻进屋里,吹到脸上倒是有清新之感,但是鼻尖的温度也随之...
  • ern
  • ern
  • 2004年12月31日 00:01
  • 664

bzoj1052 HAOI2007 覆盖问题

BZOj1052 HAOI2007 覆盖问题 贪心
  • u012457935
  • u012457935
  • 2014年04月06日 09:31
  • 715

BZOJ1052【HAOI2007】覆盖问题

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1052 【分析】 先扫出覆盖所有点的最小矩形,那么放置的正方形的顶点与该矩形的顶点重合时...
  • Zarxdy34
  • Zarxdy34
  • 2015年04月11日 09:56
  • 533

[BZOJ 1052] 覆盖问题 二分+搜索(DFS)+贪心

题目传送门:【BZOJ 1052】题目大意:某人在山上种了 N 棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,他决定用 3 个 L * L 的正方形塑料薄膜将小树遮起来。 我们将山建立一个...
  • ArcCCcp
  • ArcCCcp
  • 2017年07月10日 20:13
  • 128

冬天来了,请防寒!

Forever Younglets dance in style, lets dance for a while heaven can wait were only watching the skie...
  • charon_ldm
  • charon_ldm
  • 2004年12月18日 20:29
  • 757

【二分+贪心】BZOJ1052: [HAOI2007]覆盖问题

题目概述 有 nnn 个点,用 333 块 L×LL×LL\times L 的布盖住所有点,求最小的 LLL 。 解题报告 这是道套路贪心假题……首先二分将求最优解问题转换为判定问题,然后...
  • zzkksunboy
  • zzkksunboy
  • 2018年02月18日 16:13
  • 44

【bzoj1052】[HAOI2007]覆盖问题

一道简单的二分+贪心,先找四个最大最小坐标,以四个角中的一个为左上角划正方形,再找再划,最后判断剩下的点是否在一个正方形内。 AC Code: #include #include #inclu...
  • ACquick
  • ACquick
  • 2015年11月14日 23:51
  • 136

也谈"冬天来了"?

最近喊“冬天来了”的声音不少,心里很迷惑。首先要问,这个所谓冬天是谁的冬天?很显然,互联网产业的大佬们关注的是互联网生态,我初步理解他们说是互联网的冬天来了,具体来讲是中国互联网的冬天来了。为什么有这...
  • shanhe
  • shanhe
  • 2006年08月01日 01:19
  • 3138
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj1052】【HAOI2007】【覆盖问题】【贪心】
举报原因:
原因补充:

(最多只允许输入30个字)