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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

BZOJ 1069 SCOI 2007 最大土地面积 凸包+旋转卡壳

题目大意:给出平面上的一些点,求其中四个点的最大四边形的面积。 思路:简单yy一下发现这些点肯定都在凸包上,先求个凸包。然后直接暴力肯定是不行的,我们需要一个O(n^2)的做法,比较简单的想...

bzoj 1069: [SCOI2007]最大土地面积(旋转卡壳)

1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 3438  Solved: 1373 [Submit][S...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

[BZOJ1069]SCOI2007最大土地面积|凸包|旋转卡壳

这大概才是真正的第一题计算几何了。。首先这四个点肯定在凸包上,所以求出凸包,之后枚举四边形的对角线AB,凸包求出来之后点是按逆时针排序的,不妨设B在A的逆时针方向,那么就在A逆时针转到B的点之间取一个...

BZOJ 1069 [SCOI2007]最大土地面积

凸包+旋转卡壳

BZOJ 1069 SCOI2007 最大土地面积 旋转卡壳

题目大意:给定一个点集,任选四点构成一个凸多边形,求面积最大的凸多边形 枚举四边形的对角线,每次固定一个点,扫对角线上的另一个点 每次找到对角线两侧离对角线最远的点,由于两边的点的移动是单调的,因...

bzoj1069【SCOI2007】最大土地面积

凸包+旋转卡壳

【SCOI2007】bzoj1069 最大土地面积

旋转卡壳

bzoj 1069: [SCOI2007]最大土地面积

Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大。 Input 第1行一个正整数N,接下来N行,每行2个数...

【BZOJ 1069】 [SCOI2007]最大土地面积

旋转卡壳维护最大四边形~

BZOJ 1069 [SCOI2007] 最大土地面积

旋转卡壳
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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