n个点组成多少个三角形Java,农田开发 NOJ (已知N个点选取3个求最大三角形面积问题)...

题目描述

有一块农田,田地里安放上N个小木桩,木桩的占地面积忽略不计。选择三个小木桩,使得三个小木桩的围成的三角形占地面积最大。

输入

第一行一个整数N(3<=n<=100),便是木桩个数。

接下来N行,每行含有两个整数xi和yi(-10000<=xi,yi<=10000),表示第i个木桩的平面坐标。

输出

仅含有一个数,表示得到的农田面积的最大值,结果保留一位小数。

样例输入

4 0 0 0 1 1 0 1 1

样例输出

0.5

实现代码:

#include

#include

#include

#include

#include

using namespace std;

const int N=50005;

struct Point

{

double x,y;

};

Point stack[N];

Point p[N];

Point MinA;

int top;

double dist(Point A,Point B)

{

return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));

}

double cross(Point A,Point B,Point C)

{

return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);

}

bool cmp(Point a,Point b)

{

double k=cross(MinA,a,b);

if(k>0) return 1;

if(k<0) return 0;

return dist(MinA,a)

}

void Graham(int n)

{

int i;

for(i=1; i

if(p[i].y

swap(p[i],p[0]);

MinA=p[0];

sort(p+1,p+n,cmp);

stack[0]=p[0];

stack[1]=p[1];

top=1;

for(i=2; i

{

while(cross(stack[top-1],stack[top],p[i])<=0&&top>=1) --top;

stack[++top]=p[i];

}

}

double rotating_calipers(int n)

{

int j=1,k=0;

double ans=0;

for(int i=0;i

{

j=(i+1)%n;

k=(j+1)%n;

while(fabs(cross(stack[i],stack[j],stack[k]))

k=(k+1)%n;

while(j!=i&&k!=i)

{

ans=max(ans,fabs(cross(stack[i],stack[j],stack[k])));

while(fabs(cross(stack[i],stack[j],stack[k]))

k=(k+1)%n;

j=(j+1)%n;

}

}

return ans*0.5;

}

int main()

{

int n;

while(~scanf("%d",&n))

{

if(n==-1) break;

for(int i=0;i

scanf("%lf%lf",&p[i].x,&p[i].y);

if(n<3)

{

puts("0.00");

continue;

}

Graham(n);

top++;

if(top<3)

{

puts("0.0");

continue;

}

if(top==3)

{

printf("%.1lf\n",fabs(cross(stack[0],stack[1],stack[2]))/2);

continue;

}

printf("%.1lf\n",rotating_calipers(top));

}

return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值