地址:
点击打开链接
一直看不太懂网上的凸包模板,索性就按照自己了解的来吧,一开始忘了初始化res,一直wa,心累
代码
#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX 50005
using namespace std;
struct point{
double x ;
double y ;
}points[MAX];
int ans[MAX];//用于记录凸包的顺时针索引
int n ;
bool cmp(point a , point b )
{
if(a.y==b.y)
return a.x<b.x;
return a.y<b.y;
}
double judge(point a, point b , point base )
{
return (a.x - base.x)*(b.y-base.y)-(b.x-base.x)*(a.y-base.y);
}
int bk(int n)
{
sort(points+1,points+n+1,cmp);
int index=1;
ans[1]=1 ;
do{
index++;
int t = ans[index-1]+1;//找到上一次解决的点,+1得到下一个点
if(t>n)
t = 1 ;//注意这个地方,其实把最后的点也算了进去,也就是围城了一个圈,当把最后一个点算进去的时候才中止
for(int i = 1 ; i<= n ; i ++)
{
if(judge(points[i],points[t],points[ans[index-1]])<0)
{
t = i ;
}
}//这个地方还很巧妙的把共线的情况也算了进去,很厉害,如果共线,那么上面的if肯定进不去,就会在上一个的基础上把t原封不懂得传递过来
ans[index]=t;
}while(ans[index]!=ans[1]);
return index-1 ;
}
int main(){
int i , j ,k,num;
while(scanf("%d",&n)!=EOF)
{
for(i = 1 ; i <= n ; i++)
{
scanf("%lf%lf",&points[i].x,&points[i].y);
}
num = bk(n);
double res = 0;
for(i = 1; i <=num ; i++)
{
for(j = i+1 ; j <= num ; j++)
{
for(k = j+1 ; k<=num ; k ++)
{
res = abs(max(res,judge(points[ans[k]],points[ans[j]],points[ans[i]])));
}
}
}
printf("%.2lf\n",0.5*res);
}
return 0 ;
}