#include <algorithm>
#include <iostream>
#include<cmath>
#include <stack>
using namespace std;
struct Point
{
double x;
double y;
};
Point points[10001],result[10001];
stack<Point> mystack;
//定义叉积
double ExternMultiply(Point ap,Point bp,Point op)
{
return (ap.x-op.x)*(bp.y-op.y)-(bp.x-op.x)*(ap.y-op.y);
}
//定义内积
double InternMultiply(Point ap,Point bp,Point op)
{
return (ap.x-op.x)*(bp.x-op.x)+(bp.y-op.y)*(ap.y-op.y);
}
double Parea(Point ap,Point bp,Point op)
{
return 0.5*fabs(ExternMultiply(ap,bp,op));
}
double distances(Point ap,Point bp)
{
return sqrt((ap.x-bp.x)*(ap.x-bp.x)+(ap.y-bp.y)*(ap.y-bp.y));
}
//此函数为排序之标准
int comp(const void* args_ap,const void* args_bp)
{
Point ap =*(Point*)args_ap;
Point bp =*(Point*)args_bp;
Point op =points[0];
// 如果三点在同一直线上,那么按相对于op由近到远排序
if(ExternMultiply(ap,bp,op)==0)
{
return distances(op,ap)<distances(op,bp)?-1:1;
}
//如果三点不在同一直线上,则按oa,ob的顺时针排序
else
{
return ExternMultiply(ap,bp,op)<0?-1:1;
}
}
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>points[i].x>>points[i].y;
//找出最小y坐标的,如果相同y坐标,则取最左边的
int temp =0;
for (i =0;i<n;i++)
{
if (points[i].y<points[temp].y) temp =i;
else if (points[i].y==points[temp].y && points[i].x<points[temp].x)
temp =i;
}
//交换将最小y坐标点换至points[0]处
Point tmp;
tmp.x =points[0].x;tmp.y = points[0].y;
points[0].x = points[temp].x;
points[0].y = points[temp].y;
points[temp].x =tmp.x;
points[temp].y = tmp.y;
//排序 points[1] ...points[n-1],以points[0]为圆心,按顺时针方向
qsort(points+1,n-1,sizeof(Point),comp);
result[0]=points[0];
result[1]=points[1];
result[2]=points[2];
int top =2;
for(i=3;i<n;i++)
{
while(ExternMultiply(result[top],points[i],result[top-1])>=0)top--;
result[++top]=points[i];
}
//自组织一个栈 result
double Plasture_area=0;
for (i=2;i!=0;i=(i+1)%(top+1))
{
Plasture_area+= Parea(result[i],result[i-1],result[0]);
}
printf("%ld",(long)Plasture_area/50);
return 0;
}
528

被折叠的 条评论
为什么被折叠?



