【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);
}


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

相关文章推荐

bzoj 1052: [HAOI2007]覆盖问题

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

BZOJ1052【HAOI2007】覆盖问题

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

【BZOJ1052】【HAOI2007】覆盖问题 二分+深搜check

题解:乱搞。 就是搜每个正方形的位置(一定在一个角,证明自己想想吧,很容易但是不算太好写) 代码: #include #include #include #include #de...

BZOJ 1052 HAOI2007 覆盖问题 二分答案+DFS

题目大意:给定n个点,用三个边长相同的正方形覆盖所有点,要求正方形边界与坐标轴垂直,求正方形边长的最小值 最大值最小,很明显二分答案 但是验证是个问题 考虑只有三个正方形,故用一个最小矩形覆盖这...

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

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

BZOJ 1046: [HAOI2007]上升序列

。。这么水的一道最长下降子序列我为什么会狂wawa呢。。 呜啊。。我真是蒟蒻一枚。。。 要把这列数全倒过来做,然后跑最长下降子序列 然后再倒回来输出方案就好了。。。

【bzoj1046】 HAOI2007—上升序列

http://www.lydsy.com/JudgeOnline/problem.php?id=1046 (题目链接)题意:给出一个数列,求数列中长度为L的下标字典序最小的上升子序列。Solution...

[BZOJ]1053 [HAOI2007]反素数ant (因数个数分析+DFS搜索)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1053 题目大意:对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)...

【BZOJ】【P1047】【HAOI2007】【理想的正方形】【题解】【单调队列】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调 预处理出

【BZOJ 1047】 [HAOI2007]理想的正方形

单调队列优化的dp~ 二维转化为一维~
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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