bzoj1069: [SCOI2007]最大土地面积

原创 2016年05月30日 10:41:48

题目链接

bzoj1069

题目描述

Description

  在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。

Input

  第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。

Output

  最大的多边形面积,答案精确到小数点后3位。

Sample Input

5
0 0
1 0
1 1
0 1
0.5 0.5

Sample Output

1.000

HINT

数据范围 n<=2000, |x|,|y|<=100000

题解

所以可以枚举一条对角线然后在两边分别用旋转卡壳找一个最大面积三角形。


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;

const int eps=1e-9;
const int N=1010;
struct point{
    double x,y;
    point(){}
    point(double _x,double _y){
        x=_x; y=_y;
    }
}p[N],stk[N],t[4];
int n,top,fir;
double ans=0;

bool operator <(point a,point b){
    if(fabs(a.x-b.x)>eps) return a.x<b.x;
    return a.y<b.y;
}
point operator -(point a,point b){
    return point(a.x-b.x,a.y-b.y);
}
double operator *(point a,point b){
    return a.x*b.y-b.x*a.y;
}

void graham(){
    stk[0]=p[0];
    for(int i=1;i<n;i++){
        while(top>0&&(stk[top]-stk[top-1])*(p[i]-stk[top])>=0) top--;
        stk[++top]=p[i];
    }
    int tmp=top;
    for(int i=n-2;~i;i--){
        while(top>tmp&&(stk[top]-stk[top-1])*(p[i]-stk[top])>=0) top--;
        stk[++top]=p[i];
    }
}
void solve(){
    for(int i=0;i<top;i++){
        int t1=(i+1)%top,t2=(i+2)%top;
        for(int j=i+2;j<top;j++){
            while((stk[j]-stk[i])*(stk[t1]-stk[i])<(stk[j]-stk[i])*(stk[t1+1]-stk[i])) t1=(t1+1)%top;
            while((stk[t2]-stk[i])*(stk[j]-stk[i])<(stk[t2+1]-stk[i])*(stk[j]-stk[i])) t2=(t2+1)%top;
            ans=max(ans,(stk[j]-stk[i])*(stk[t1]-stk[i])/2+(stk[t2]-stk[i])*(stk[j]-stk[i])/2);
        }
    }
    printf("%.3f",ans);
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
    sort(p,p+n);
    graham(); solve();
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

bzoj1069【SCOI2007】最大土地面积

凸包+旋转卡壳
  • AaronGZK
  • AaronGZK
  • 2016年04月18日 23:57
  • 2397

bzoj1069[SCOI2007]最大土地面积

先搞出凸包,然后当然枚举两点当成对角线然后旋转卡壳来计算另外两个点与枚举的那两个点所构成的三角形面积的最大值 #include #include #include #include #include...
  • BPM136
  • BPM136
  • 2015年11月30日 21:58
  • 684

【bzoj1069】[SCOI2007]最大土地面积

1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 3673  Solved: 1454 [Submit][S...
  • Joky_2002
  • Joky_2002
  • 2017年11月09日 09:29
  • 71

【SCOI2007】bzoj1069 最大土地面积

旋转卡壳
  • sdfzyhx
  • sdfzyhx
  • 2017年04月14日 08:01
  • 171

【bzoj1069】[SCOI2007]最大土地面积

凸包,旋转卡壳
  • KikiDMW
  • KikiDMW
  • 2017年03月26日 16:58
  • 250

1069: [SCOI2007]最大土地面积

准备开始BZOJ补完计划了。 话说终于可以切计算几何了,好开森。 虽然这题确实很简单。。。。。 第一眼就看出来 凸包+旋转卡壳没跑了。 先求凸包。 然后在旋转卡壳的时候,每次求出一对对踵点,...
  • nlj1999
  • nlj1999
  • 2016年01月19日 20:38
  • 666

[凸包] BZOJ1069: [SCOI2007]最大土地面积

题意在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大。 n...
  • CHHNZ
  • CHHNZ
  • 2017年06月29日 20:09
  • 292

【BZOJ1069】[SCOI2007]最大土地面积【凸包】

【题目链接】 显然四个点都在凸包上,按逆时针设为i, a, j, b,枚举i和j,a和b都是单调的,复杂度为O(n^2) 闲得无聊写了个暴力。。 /* Forgive me Not ...
  • BraketBN
  • BraketBN
  • 2016年06月12日 22:39
  • 238

[SCOI2007] 最大土地面积

题目描述在某块平面土地上有n个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大输入格式第1行一个正整数n,接下来n行,每行2个数x、y,表示该点的横坐标和纵坐...
  • Bill_Yang_2016
  • Bill_Yang_2016
  • 2017年01月21日 09:25
  • 94

1069: [SCOI2007]最大土地面积

1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 2506  Solved: 955 [Submit][St...
  • CRZbulabula
  • CRZbulabula
  • 2016年05月15日 06:58
  • 651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj1069: [SCOI2007]最大土地面积
举报原因:
原因补充:

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