hdu 2202 最大三角形

本文介绍了一种基于逆时针旋转判断和两点间距离计算的凸包构建算法,并通过示例代码展示了如何实现该算法。文章详细解释了关键步骤,如点排序、凸包构建过程及三角形面积的最大值计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

代码如下:

#include<iostream>
#include<math.h>
using namespace std;
struct L
{
int x;
int y;
}qs[50001],stack[50001];
double dis(L a,L b)//求两点之间的距离 
{
return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
double mul(L x1,L x2,L x3)//判断是否是按照逆时针旋转 
{
return (x2.x-x1.x)*(x3.y-x1.y)-(x2.y-x1.y)*(x3.x-x1.x);
}
int cmp(const void *a,const void *b)
{
L *c=(L *)a;
L *d=(L *)b;
double k=mul(qs[0],*c,*d);
if(k<0||(!k&&dis(*c,qs[0])>dis(*d,qs[0])))
return 1;
return -1;
}
void tubao(int n,int &top)//建立凸包 
{
top=2;
stack[0]=qs[0];
stack[1]=qs[1];
stack[2]=qs[2];
for(int i=3;i<n;i++)
{
   while(mul(stack[top-1],stack[top],qs[i])<=0&&top>=2)
   top--;
   top++;
   stack[top]=qs[i];
}
}
int main()
{
int i,j,n,x,y,k;
while(cin>>n)
{
   x=y=100000;
   for(i=0;i<n;i++)
   {
    scanf("%d %d",&qs[i].x,&qs[i].y);
    if(qs[i].x<x||qs[i].x==x&&qs[i].y<y)
    {
     x=qs[i].x;
     y=qs[i].y;
     k=i;
    }
   }
   if(n<=2)printf("0.00\n");
   else
   {
    L tem;
    tem=qs[0];
    qs[0]=qs[k];
    qs[k]=tem;
    int top;
    qsort(qs+1,n-1,sizeof(qs[0]),cmp);
    tubao(n,top);
    double s=0,f,p,a,b,c;
    for(i=0;i<=top-2;i++)
    for(j=i+1;j<=top-1;j++)
    for(k=j+1;k<=top;k++)
    {
     a=dis(stack[i],stack[j]);
     b=dis(stack[i],stack[k]);
     c=dis(stack[j],stack[k]);
     p=(a+b+c)/2.0;
     f=sqrt(p*(p-a)*(p-b)*(p-c));//求三角形面积 
     if(f>s)s=f;
    }
    printf("%.2lf\n",s);
   }
}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值