nyist 最大四边形

描述
平面坐标上有n个点,你知道能组成四边形中面积最大的是多少吗?
输入
有多组测试数据
第一行整数n,表示有n个点,( 4<=n<=300 )
然后n行,每行x,y表示点的坐标。(没有重复的点)
输出
最大四边形的面积.(保留六位小数)
样例输入
5
0 0
0 4
4 0
4 4
2 3
样例输出
16.000000
思路:枚举所有情况,for循环控制,首先确定两个坐标 构成一条线段  再从剩下的坐标点中挑出两个点位于该线段的两边(叉乘结果一正一负) 且与线段向量叉乘的结果最大

主要就是枚举 防止超时的较好

代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#define pi 1e-8
using namespace std;
int n;
struct node{
double x,y;
}p[330];
double area(node a,node b,node c)
{
    return (a.x-b.x)*(c.y-b.y)-(c.x-b.x)*(a.y-b.y);
}
double judge(node a,node b)
{
    double lmax=0,rmax=0;
    for(int i=0;i<n;i++)
    {
        double tem = area(a,b,p[i]);
        if(tem<pi)lmax=max(lmax,-tem);//线段两边的两点与线段的叉乘结果正负相反 max不断更新最值就好
        if(tem>pi)rmax=max(rmax,tem);//
    }
    if(lmax==0||rmax==0)//此时a b坐标为最靠边的点。
        return 0;
    return (lmax+rmax)*0.5;
}
int main()
{
    double ans;int i,j;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        scanf("%lf%lf",&p[i].x,&p[i].y);
        ans=0;
        for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)//for 不断循环枚举
        ans=max(ans,judge(p[i],p[j]));
        printf("%.6lf\n",ans);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值