求凸包的面积除以50。。。。。大水的模版题,构造凸包的Graham Scan算法+多边形面积公式即可得到答案。
以下是代码:
- #include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-6;
const int N=11000; - struct point
{
int x,y;
}p[N],stack[N];
double ans;
int n,top; - double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y));
} - double crossmul(point p0,point p1,point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} - bool cmp(point a,point b)
{
double k=crossmul(p[0],a,b);
if(k<-eps)
return 0;
else if(fabs(k)<eps && (dis(a,p[0])-dis(b,p[0]))>eps)
return 0;
else return 1;
} - void coverhull()//构造凸包的模版
{
int i,k,d;
int miny=p[0].y,index=0;
for(i=1;i<n;i++)
{
if(p[i].y<miny)
{
miny=p[i].y;
index=i;
}
else if(p[i].y == miny && p[i].x<p[index].x)
{
index = i;
}
}
point temp;
temp=p[index];
p[index]=p[0];
p[0]=temp;
sort(p+1,p+n,cmp);
stack[0]=p[n-1];
stack[1]=p[0];
top=1;
k=1;
while(k<=n-1)
{
double d=crossmul(stack[top],stack[top-1],p[k]);
if(d<=0)
{
top++;
stack[top]=p[k];
k++;
}
else top--;
}
} -
void getarea() //求多边形面积的模版
{
int i;
for(i=0;i<top;i++)
{
ans+=crossmul(stack[0],stack[i],stack[i+1]);
}
ans=fabs(ans)/2.0;
}- int main()
{
while(scanf("%d",&n)==1)
{
int i;
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
ans=0;
coverhull();
getarea();
printf("%d/n",(int)(ans/50));
}
return 0;
}