Round #198 (Div. 2) B、Maximal Area Quadrilateral

1、题目链接:http://codeforces.com/problemset/problem/340/B
2、这道题是纯计算几何,因为我完全没有学过,比赛的时候临时抱佛脚,自然是WA一片。赛后发现问题在于:我虽然枚举了四个点,也知道四边形面积的计算公式,但是那只有在四个点是顺时针给出或者逆时针给出的时候计算结果才正确,因为我是随机枚举的,所以很可能顺序是乱的,自然WA。
3、正确的方法是枚举“对角线”,这有点像Floyd算法,然后枚举除了这个对角线外的所有点,注意,必须确保两边都有点,否则0 0,0 5,5,0,1,1这组数据通不过。(正确答案是10,但输出12.5)。找出最左边和最右边的点,算两个三角形面积,然后相加,求出一系列结果中最大的那个即可。
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct Point{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
const double eps=1e-10;
int dcmp(double x){
    if(fabs(x)<eps) return 0;else return x<0?-1:1;
}
Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}
Point a[310],p[4];
int main(){
    //freopen("a.txt","r",stdin);
    int n;
    double ans,temp,l,r;
    while(scanf("%d",&n)==1){
        ans=0.0;
        for(int i=0;i<n;i++)
           scanf("%lf%lf",&a[i].x,&a[i].y);
        for(int i=0;i<n;i++)
           for(int j=i+1;j<n;j++){
               l=r=0.0;
               for(int k=0;k<n;k++){
                  temp=Cross(a[i]-a[k],a[j]-a[k]);
                  if(temp>0)
                      r=max(r,temp);
                  else
                      l=max(l,-temp);
               }
               if(dcmp(min(l,r))==0) continue;
               else
                  ans=max(ans,(l+r)/2);
            }
          printf("%lf\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值