zmh的博客

代码改变世界

bzoj1069: [SCOI2007]最大土地面积

题目链接

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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zmh964685331/article/details/51536203
个人分类: 模板 bzoj 计算几何
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

bzoj1069: [SCOI2007]最大土地面积

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭