就是一个求凸包面积,有两种方法,一种是用简单多边形面积公式,另一种是枚举凸包的三角形
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define inf 0x7ffffff
using namespace std;
const double eps=1e-8;
struct P
{
double x,y;
P (){}
P (double x,double y):x(x),y(y){
}
P operator +(P p){
return P(x+p.x,y+p.y);
}
P operator -(P p){
return P(x-p.x,y-p.y);
}
P operator *(double d){
return P(x*d,y*d);
}
double det(P p){
return x*p.y-y*p.x;
}
double dot(P p){
return x*p.x+y*p.y;
}
};
bool cmp(P a,P b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int n,k;
P p[100000],qs[100000];
int main()
{
while(~scanf("%d",&n))
{
k=0;
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p,p+n,cmp);
for(int i=0;i<n;i++)
{
while(k>1 && (qs[k-1]-qs[k-2]).det(p[i]-qs[k-2])<=0) k--;
qs[k++]=p[i];
}
for(int i=n-1,t=k;i>=0;i--)
{
while(k>t && (qs[k-1]-qs[k-2]).det(p[i]-qs[k-2])<=0) k--;
qs[k++]=p[i];
}
int ans=0;
for(int i=0;i<k-1;i++)
{
ans+=(int)(qs[i].x*qs[i+1].y-qs[i].y*qs[i+1].x);
}
ans=ans/2;
printf("%d\n",ans/50);
}
return 0;
}